Программирование. Принципы и практика использования C++ Исправленное издание, стр. 142
int main(){ cout << "Пожалуйста, введите имя файла для ввода: "; string name; cin >> name; ifstream ist(name.c_str()); // поток ist считывает данные // из файла, // имя которого задано строкой name if (!ist) error("Невозможно открыть файл для ввода ",name); cout << "Пожалуйста, введите имя файла для вывода: "; cin >> name; ofstream ost(name.c_str()); // поток ost записывает данные // в файл, имя которого задано // строкой name if (!ost) error("Невозможно открыть файл для вывода ",name); vector<Reading> temps; // здесь хранится считанная информация int hour; double temperature; while (ist >> hour >> temperature) { if (hour < 0 || 23 <hour) error("Некорректное время"); temps.push_back(Reading(hour,temperature)); } for (int i=0; i<temps.size(); ++i) ost << '(' << temps[i].hour << ',' << temps[i].temperature << ")\n";}10.6. Обработка ошибок ввода-вывода
Вводя данные, мы должны предвидеть ошибки и обрабатывать их. Какими бывают ошибки? Как их обрабатывать? Ошибки возникают из-за того, что их совершают люди (неправильно поняли инструкцию, сделали опечатку, по клавиатуре прошлась кошка и т.д.), из-за того, что файлы не соответствуют спецификациям, из-за того, что программисты имеют неправильное представление об ожидаемых данных, и т.д. Возможности для совершения ошибок при вводе данных ничем не ограничены! Однако поток
istream
fail()bad()fail()bad()int i = 0;cin >> i;if (!cin) { // мы окажемся здесь (и только здесь), // если операция ввода не выполнена if (cin.bad()) error("cin испорчен "); // поток поврежден: стоп! if (cin.eof()) { // входных данных больше нет // именно так мы хотели бы завершить ввод данных } if (cin.fail()) { // с потоком что-то случилось cin.clear(); // приготовиться к дальнейшему вводу // исправление ситуации }}Выражение
!cincincincingood()cin.clear()fail()fail()clear()cin.clear()cingood()Рассмотрим пример использования состояния потока. Представим себе, что считываем в вектор последовательность целых чисел, которые могут завершаться символом
*1 2 3 4 5 *Ввести их можно с помощью такой функции:
void fill_vector(istream& ist, vector<int>& v, char terminator) // считывает целые числа из потока ist в вектор v, // пока не будет достигнут признак eof() или символ завершения{ int i = 0; while (ist >> i) v.push_back(i); if (ist.eof()) return; // отлично: мы достигли конца файла if (ist.bad()) error("Поток ist поврежден."); // поток поврежден;