Программирование. Принципы и практика использования C++ Исправленное издание, стр. 150
10.11.2. Считывание структурированных значений
Класс
Readingstruct Reading { int day; int hour; double temperature;};istream& operator>>(istream& is, Reading& r) // считываем показания температуры из потока is в объект r // формат: (3 4 9.7) // проверяем формат, но не корректность данных{ char ch1; if (is>>ch1 && ch1!='('){ // можно это превратить в объект типа // Reading? is.unget(); is.clear(ios_base::failbit); return is; } char ch2; int d; int h; double t; is >> d >> h >> t >> ch2; if (!is || ch2!=')') error("Плохая запись"); // перепутанные // показания r.day = d; r.hour = h; r.temperature = t; return is;}В принципе мы проверяем, правильно ли начинается формат. Если нет, то переводим файл в состояние
fail()error()Операции ввода в классе
MonthReading>>Readingistream& operator>>(istream& is, Month& m) // считываем объект класса Month из потока is в объект m // формат: { month feb... }{ char ch = 0; if (is >> ch && ch!='{') { is.unget(); is.clear(ios_base::failbit); // ошибка при вводе Month return is; } string month_marker; string mm; is >> month_marker >> mm; if (!is || month_marker!="month") error("Неверное начало Month"); m.month = month_to_int(mm); Reading r; int duplicates = 0; int invalids = 0; while (is >> r) { if (is_valid(r)) { if (m.day[r.day].hour[r.hour] != not_a_reading) ++duplicates; m.day[r.day].hour[r.hour] = r.temperature; } else ++invalids; } if (invalids) error("Неверные показания в Month", invalids); if (duplicates) error("Повторяющиеся показания в Month",duplicates); end_of_loop(is,'}',"Неправильный конец Month"); return is;}Позднее мы еще вернемся к функции
month_to_int();jun[0:11]end_of_loop()ReadingsОператор
>>MonthReadingconst int implausible_min = –200;const int implausible_max = 200;bool is_valid(const Reading& r)// грубая проверка{ if (r.day<1 || 31<r.day) return false; if (r.hour<0 || 23<r.hour) return false; if (r.temperature<implausible_min || implausible_max<r.temperature) return false; return true;}