ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн
Реагирование на ошибки
Наша следующая программа показывает наиболее удобный способ обработки ошибок. Все дисковые операции проверяются после их выполнения. Если воз- никла ошибка, выводится сообщение об этом, и программа завершает свою рабо- ту. Мы использовали технику, описанную ранее, заключающуюся в проверке значения, возвращаемого из объекта, и определении статуса его ошибки. Про- грамма открывает выходной потоковый объект, записывает целый массив целых чисел единственным вызовом write() и закрывает объект. Затем открывает вход- ной потоковый объект и считывает массив вызовом функции read().
Листинг 12.14. Программа REWERR
// rewerr.cpp
// Обработка ошибок ввода/вывода
#include <fstream> // для файловых потоков
#include <iostream>
using namespace std;
#include <process.h> // для exit()
const int MAX = 1000;
int buff[MAX];
int main()
{
for(int j=0; j<MAX; j++) // заполнить буфер данными
buff[j] = j;
ofstream os; // создать выходной поток
// открыть его
os.open("a:edata.dat", ios::trunc | ios::binary);
if(!os)
{ cerr << "Невозможно открыть выходной файл\n"; exit(1); }
cout << "Идет запись...\n"; // записать в него содержимое
// буфера
os.write( reinterpret_cast<char*>(buff), MAX*sizeof(int) );
if(!os)
{ cerr << "Запись в файл невозможна\n"; exit(1); }
os.close(); // надо закрыть поток
for(j=0; j<MAX; j++) // очистить буфер
buff[j] = 0;
ifstream is; // создать входной поток
is.open("a:edata.dat", ios::binary);
if(!is)
{ cerr << "Невозможно открыть входной файл\n";exit(1); }
cout << "Идет чтение...\n"; // чтение файла
is.read( reinterpret_cast<char*>(buff), MAX*sizeof(int) );
if(!is)
{ cerr << "Невозможно чтение файла\n"; exit(1); }
for(j=0; j<MAX; j++) // проверять данные
if( buff[j] != j )
{ cerr << "\nДанные некорректны\n"; exit(1); }
cout << "Данные в порядке\n";
return 0;
}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48