ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 12) онлайн

Анализ ошибок

В этом примере мы определили наличие ошибки ввода/вывода проверкой значе- ния, возвращаемого потоковым объектом.

if(!is)

//Возникла ошибка

Здесь is возвращает значение указателя, если все прошло без ошибок. В про- тивном случае возвращается 0. Это жесткий подход к определению ошибок: не имеет значения, какая именно ошибка возникла, все ошибки обрабатываются одинаково. С помощью флагов статуса ошибок ios, тем не менее, можно извлечь более подробную информацию об ошибках файлового ввода/вывода.

Мы уже видели некоторые из этих флагов статуса в работе, когда обсуждали вывод на экран и ввод с клавиатуры. В следующем примере показано, как мож- но использовать их при файловом вводе/выводе.

Листинг 12.15. Программа FERRORS

// ferrors.cpp

// Проверка ошибок открытия файла

#include <fstream>           // для файловых функций

#include <iostream>

using namespace std;

 

int main()

{

  ifstream file;

  file.open("a:test.dat");

 

  if( !file )

    cout << "\nНевозможно открыть GROUP.DAT";

  else

    cout << "\nФайл открыт без ошибок.";

  cout << "\nfile = " << file;

  cout << "\nКод ошибки = " << file.rdstate();

  cout << "\ngood() = " << file.good();

  cout << "\neof() = " << file.eof();

  cout << "\nfail() = " << file.fail();

  cout << "\nbad() = " << file.bad() << endl;

  file.close();

  return 0;

}

 

Вначале программа проверяет значение файлового объекта. Если оно нуле- вое, значит, файл, возможно, не существует и поэтому не может быть открыт. Вот результат работы программы в такой ситуации:

Невозможно открыть GROUP.DAT

file = 0x1c730000

Код ошибки = 4

Good() = 0

eof() = 0

fail() = 4

bad() = 4

Код ошибки, возвращаемый rdstate(), равен четырем. Это бит, который гово- рит о том, что файл не существует. Он устанавливается в единицу. Остальные биты при этом равны нулю. Функция good() возвращает 1 (true) лишь в том случае, когда не установлены никакие биты ошибок, поэтому в нашем примере она вернула 0 (false). Указатель файла находится не на EOF, поэтому eof() воз- вращает 0. Флаги fail() и bad() устанавливаются в ненулевое значение — это их реакция на произошедшую ошибку.

В настоящей, серьезной программе некоторые из этих функций должны ис- пользоваться после каждой операции ввода/вывода, и тогда не останется сомне- ний в том, что все идет как нужно.

 

35