bool RINEX_NavigationMessage::ReadBody(std::ifstream &ifs, int leap_sec)
{
	bool success = false;
	std::string buf;
	int top_field_length;

	if ((type == GPS_Navigation) && ((ver == RINEX::Ver2) || (ver == RINEX::Ver210) || (ver == RINEX::Ver211) || (ver == RINEX::Ver212)))
	{
		top_field_length = RINEX_TOP_FIELD_WIDTH_Normal;
	}
	else
	{
		top_field_length = RINEX_TOP_FIELD_WIDTH_QZS_and_300_above;
	}

	while (ifs)
	{
		Ephemeris ephem;
		int prn = 0;
		for (Ephemeris::Ephemeris_column column = Ephemeris::TOC; column < Ephemeris::END; column = (Ephemeris::Ephemeris_column)(column + 4))
		{
			std::getline(ifs, buf);
			if (!ifs)
			{
				break;
			}
			else
			{
				if (column == Ephemeris::TOC)
				{
					int Epoch_offset;
					if ((type == GPS_Navigation) && ((ver == RINEX::Ver2) || (ver == RINEX::Ver210) || (ver == RINEX::Ver211) || (ver == RINEX::Ver212)))
					{
						prn = atoi(buf.substr(0, 2).c_str());
						Epoch_offset = 2;
					}
					else
					{
						std::string satellite_type = buf.substr(0, 1);
						if (satellite_type == "G")
						{
							prn = atoi(buf.substr(1, 2).c_str());
						}
						else if (satellite_type == "J")
						{
							prn = atoi(buf.substr(1, 2).c_str()) + RINEX::QZSS_PRN_Offset;
						}
						Epoch_offset = 3;
					}

					ephem.SetPRN(prn);
					int year = atoi(buf.substr(Epoch_offset, 3).c_str());
					if (year < 80)
					{
						year += 2000;
					}
					else
					{
						year += 1900;
					}
					int month = atoi(buf.substr(Epoch_offset + 3, 3).c_str());
					int day = atoi(buf.substr(Epoch_offset + 6, 3).c_str());
					int hour = atoi(buf.substr(Epoch_offset + 9, 3).c_str());
					int minute = atoi(buf.substr(Epoch_offset + 12, 3).c_str());
					long double sec;
					sscanf(buf.substr(Epoch_offset + 15, 5).c_str(), "%Lf", &sec);
					ephem.SetToc(GPS_Time(year, month, day, hour, minute, sec, leap_sec));
					success = true;
				}
				else
				{
					ephem.SetData(GetLongDouble(buf.substr(0, top_field_length)), column);
				}

				if (column != Ephemeris::TOT)
				{
					for (int i = 1; i < RINEX_NAV_FIELDS_LINE; i++)
					{
						ephem.SetData(GetLongDouble(buf.substr(top_field_length + (i - 1) * RINEX_NORMAL_FIELD_WIDTH, RINEX_NORMAL_FIELD_WIDTH)), (Ephemeris::Ephemeris_column)(column + i));
					}

				}
				else
				{
					ephem.SetData(GetLongDouble(buf.substr(top_field_length, RINEX_NORMAL_FIELD_WIDTH)), Ephemeris::FIT);
				}


			}
		}

		if (prn < 1)
		{
			continue;
		}
		else
		{
			// Do nothing
		}

		ephem_map.insert(std::multimap<int, Ephemeris>::value_type(prn, ephem));

	}

	return success;
}