Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / Нейбауэр А. Моя первая программа на С.doc
Скачиваний:
182
Добавлен:
02.05.2014
Размер:
3.75 Mб
Скачать

Как избежать ошибок выполнения

Иногда возникает ситуация, в которой операционная система не может открыть файл, указанный в функции fopen(). Причиной этому может быть отсутствие места на диске. Не исключена и возможность того, что указанный файл просто не существует. Возможна также ситуация, когда вы пытаетесь распечатать данные на принтере, а принтер не включен, или в нем отсутствует бумага.

Если вы попытаетесь использовать файл, который нельзя открыть, программа остановится в результате ошибки выполнения. Чтобы избежать подобного аварийного выхода из программы, можно использовать инструкцию if, которая будет останавливать программу в случае невозможности открытия файла. С помощью следующих инструкций, использующих if, можно открыть файл и проверить, действительно ли он открыт:

if ((cdfile = fopen("CD.DAT", "w")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

NULL — это специальное значение, определенное в файле заголовков STDIO.H. Если произошла ошибка и открыть файл невозможно, система вернет значение NULL вместо адреса файловой структуры, и выполнение программы прекратится. Аналогичное условие можно внести и в инструкции печати информации на принтере: if ((cdfile = fopen("prn", "w")) == NULL) { puts("Включите принтер и запустите программу снова"); exit(); }

Замечания по Си++

В Си++ наряду со стандартными потоками ввода cin и вывода cout существует возможность создания потоков для работы с файлами. С их помощью можно осуществлять чтение и запись в файл, используя операторы >> и <<. Например, некоторые компиляторы позволяют создать поток для чтения файла, используя следующий синтаксис:

ifstream file_pointer(file_name)

Для записи в файл используется следующий синтаксис:

ofstream file_pointer(file_name)

Для выполнения этих операций может оказаться необходимым использование специальных файлов заголовков. Проверьте документацию вашего компилятора, чтобы узнать имя файла заголовков и способ его использования.

Если принтер не включен, на экране появится сообщение о том, что надо включить принтер, а затем запустить программу еще раз. Можно использовать и цикл while, с тем чтобы дать пользователю возможность исправить ошибку:

while ((cdfile = fopen("prn", "w")) == NULL)

{

puts("Включите принтер и нажмите Enter");

flag = getchar();

}

Заметьте, что в некоторых системах нет необходимости в подобных сообщениях. Если принтер не готов к печати, операционная система выведет на дисплей собственное сообщение, предлагающее пользователю либо остановить выполнение операции (abort), либо попробовать повторить ее еще раз (retry). При появлении такого сообщения следует включить принтер и нажать клавишу R, чтобы повторить попытку вывода на печать.

Как закрыть файл

После окончания записи в файл или чтения из файла необходимо его закрыть, то есть прервать связь между файлом и программой. Это осуществляется с помощью инструкции

fclose(file_pointer);

Закрывая файл, мы получаем гарантию, что вся информация, имевшаяся в буфере, действительно записана в файл. Если выполнение программы заканчивается до закрытия файла, какая-то не попавшая на диск часть информации может остаться в буфере, в результате чего она будет утрачена. Кроме того, не будет надлежащим образом записан символ конца файла, и в следующий раз программа не сможет получить доступ к файлу.

Следует добавить, что закрытие файла освобождает указатель, после чего он может быть использован с другим файлом или для выполнения других операций с тем же файлом. В качестве примера предположим, что вы хотите создать файл, записать в него данные, а затем убедиться, что информация записана правильно. Для этого в программе можно использовать структуру, приведенную в Листинге12.1.

Листинг 12.1. Использование одного указателя файла в двух операциях.

FILE *cdfile;

if((cdfile = fopen("CD.DAT", "w")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

/* Здесь должны располагаться инструкции записи в файл */

fclose(cdfile);

if((cdfile = fopen("CD.DAT", "r")) == NULL)

{

puts("Невозможно открыть файл");

exit();

}

/* В этом месте должны быть записаны

инструкции чтения из файла */

fclose(cdfile);

Здесь файл сначала открывается с использованием режима доступа "w", затем в него записывают данные. Во второй раз файл открывается с использованием режима доступа "r", что позволяет прочитать данные и вывести их на экран.

Некоторые компиляторы позволяют обеспечить запись всех данных в файл путем очистки буфера с помощью функции

flush()

Эта функция позволяет без закрытия файла очистить буфер и записать все имеющиеся в нем данные на диск или направить их на принтер.