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; }