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

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

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

if ((cdfile = fopen("CD.DAT", "w")) == NULL) { puts("Невозможно открыть файл"); exit(); }

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

Как избежать ошибок выполнения - student2.ru Замечания по Си++
В Си++ наряду со стандартными потоками ввода 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()

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

Функции ввода и вывода

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

  • посимвольная запись данных в файл или вывод их на принтер с использованием функции putc() или fputc();
  • посимвольное чтение данных из файла с использованием функции getc() или fgetc();
  • построчная запись данных в файл или вывод их на принтер с использованием функции fputs();
  • построчное чтение данных из файла с использованием функции fgets();
  • форматированный вывод символов, строк или чисел на диск или на принтер с помощью функции fprintf();
  • форматированный ввод символов, строк или чисел из файла с помощью функции fscanf();
  • запись целой структуры с использованием функции fwrite();
  • чтение целой структуры с использованием функции fread().

Работа с символами

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

/*fputc.c*/#include main() { FILE *fp; char letter; if((fp = fopen("MYFILE","w"))==NULL) { puts("Невозможно открыть файл"); exit(); } do { letter=getchar(); fputc(letter, fp); } while(letter != '\r'); fclose(fp); }

Файл открывается с режимом доступа "w". Если файл с именем MYFILE не существует к моменту выполнения программы, он будет создан. В цикле do, с помощью функции getchar(), осуществляется ввод последовательности символов, которые затем записываются в файл с помощью функции putc(). Синтаксис записи putc() таков:

putc(char_variable, file_pointer);

С теми же аргументами может использоваться и функция fputc().

Цикл выполняется до тех пор, пока не нажата клавиша Enter, которая вводит код «возврат каретки» (\r), после чего файл закрывается.

Как избежать ошибок выполнения - student2.ru Буферизированный ввод функции getchar()
Если в вашем компиляторе функция getchar() используется для буферизированного ввода, то для ввода отдельных символов, предназначенных для записи в дисковый файл, вы можете применить вместо нее функцию getche(). В этом случае цикл do...while можно заменить циклом while: while ((letter = getche())) != '\r')

Наши рекомендации