Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.doc
Скачиваний:
40
Добавлен:
12.04.2015
Размер:
4.91 Mб
Скачать

Определение конца файла

Обычной файловой операцией в программах является чтение содержимого файла до тех пор, пока не встретится конец файла. Чтобы определить конец файла, в программе можно использовать функцию еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если встретился конец файла. Используя цикл while, можно непрерывно читать содержимое файла, пока не будет достигнут конец файла. Например:

while (! input_file.eof())

{

// Операторы

}

В данном случае программа будет продолжать выполнять цикл, пока функция eof возвращает ложь (0). Следующая программа TEST_EOF.CPP использует функцию eof для чтения содержимого файла BOOKINFO.DAT, пока не будет достигнут конца файла. Например:

#include <iostream.h>

#include <fstream.h>

void main (void)

{

ifstream input_file("BOOKINFO.DAT");

char line[64];

while (! input_file.eof())

{

input_file.getline(line, sizeof(line));

cout << line << endl;

}

}

Аналогично, следующая программа WORD_EOF.CPP читает содержимое файла по одному слову за один раз, пока не встретится конец файла:

#include <iostream.h>

#include <fstream.h>

void main(void)

{    ifstream input_file("BOOKINFO.DAT");

char word[64] ;

while (! input_file.eof())

{

input_file >> word;

cout << word << endl;

}

}

И наконец, следующая программа CHAR_EOF.CPP читает содержимое файла по одному символу за один раз, используя функцию get, пока не встретит конец файла. Например:

#include <iostream.h>

#include <fstream.h>

void main(void)

{

ifstream input_file("BOOKINFO.DAT");

char letter;

while (! input_file.eof())

{

letter = input_file.get();

cout << letter;

}

}

Проверка ошибок при выполнении файловых операций

Рассмотренные нами программы не контролировали наличия ошибок при вводе-выводе, например: наличие файла при вводе или успешное выполнение операции при выводе в файл. Для контроля за наличием ошибок можно использовать функцию fail(). Если в процессе файловой операции ошибок не было, то эта функция возвратит ложь (0). Однако если встретилась ошибка, функция fail() возвратит истину. Например:

ifstream input_file("FILENAME.DAT");

if (input_file.fail())

{

cerr << "Ошибка открытия FILENAME.EXT" << endl;

exit(1);

}

Следующая программа TEST_ALL.CPP использует функцию fail() для проверки различных ошибочных ситуаций. Например:

#include <iostream.h>

#include <fstream.h>

void main(void)

{

char line[256] ;

ifstream input_file("BOOKINFO.DAT") ;

if (input_file.fail()) cerr << "Ошибка открытия BOOKINFO.DAT" << endl;

else

{

while ((! input_file.eof()) && (! input_file.fail()))

{

input_file.getline(line, sizeof(line)) ;

if (! input_file.fail()) cout << line << endl;

}

}

}

Закрытие файла

При завершении программы операционная система закроет открытые ею файлы. Однако, как правило, если программе файл больше не нужен, она должна его закрыть. Для закрытия файла программа должна использовать функцию close(). Например:

input_file.close ();

Управление открытием файла

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

ifstream output_file("FILENAME.EXT", ios::app);

В данном случае параметр ios::app указывает режим открытия файла. Режимы открытия файлов представлены в табл. 6.1.

Таблица 6.1 – Значения режимов открытия.

Режим открытия

Назначение

ios::app

Открывает файл в режиме добавления, располагая файловый указатель в конце файла

ios::ate

Устанавливает файловый указатель в конце файла

ios::in

Указывает открыть файл для ввода

ios::nocreate

Указывает, если указанный файл не существует, не создавать файл и возвратить ошибку

ios::noreplace

Указывает, если файл существует, операция открытия должна быть прервана и должна возвратить ошибку

ios::out

Указывает, что надо открыть файл для вывода

ios::trunc

Сбрасывает (перезаписывает) содержимое существующего файла

Чтобы предотвратить перезапись существующего файла следующая инструкция, используя режим ios::nore­place, открывает файл для вывода:

ifstream output_file("Filename.EXT", ios::out ios::noreplace);