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

14.1Файловый ввод/вывод с помощью потоков

В языке С++ файл рассматривается как поток (stream), представляющий собой последовательность считываемых или записываемых байтов. При этом поток «не знает», что и в какой последовательности в него записано. Расшифровка смысла записанных последовательностей байтов лежит на программе.

Язык С++ работает с файловым вводом/выводом во многом так же, как он это делает со стандартным вводом/выводом. Для работы с файлами необходимо подключить заголовочный файл fstream.h. При этом автоматически включается и файл iostream.h, поэтому его не нужно подключать явно.

В С++ определены три класса файлового ввода/вывода:

  • ifstream – входные файлы для чтения;

  • ofstream – выходные файлы для записи;

  • fstream – файлы для чтения и записи.

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

ofstream fout;

Имя объекта может быть любым допустимым именем С++.

Затем необходимо поставить в соответствие объекту определенный файл. Это можно сделать с помощью функции open():

fout.open(“test.dat”);

Два этих этапа (создание объекта и связывание его с файлом) можно объединить в одном операторе:

ofstream fout(“test.dat”);

После этого объект fout можно использовать точно так же, как и cout:

int i=1,j=25;

double a=25e6;

char s[10]=”строка”;

fout<<i<<’ ‘<<j<<’ ‘<<a<<’ ‘<<s<<endl;

В этом коде с помощью одного оператора осуществляется запись в файл в текстовом виде данных разного типа: двух целочисленных переменных, действительного числа и строки. После того, как файл закроется, в нем будет записан текст «1 25 2.5е+07 строка».

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

Требования к чтению файла очень похожи на требования к записи:

  1. Создать переменную (объект) типа ifstream для управления потоком ввода.

  2. Поставить этот объект в соответствие определенному файлу.

  3. Использовать объект так же, как cin.

Например:

ifstream fin;

fin.open(“test.txt”);

//или fstream fin(“test.txt”);

int x;

float f;

char st[20];

fin>>x>>f; //чтение из файла числовых данных

fin.getline(st,20); //чтение строки

При установлении связи между файлом и потоком могут возникнуть ошибки (например, при открытии файла для чтения нужного файла нет на диске). В этом случае значение объекта потока равно 0, и этот факт можно использовать для отслежтвания таких ошибок:

if (!fin)

{ cout<<”Ошибка!!!\n;

return;

}

Связь с файлом прекращается автоматически, если истекает срок действия объектов потока ввода/вывода, например, по окончании выполнения программы. Кроме того, связь с файлом можно прервать явно, воспользовавшись функцией close():

fout.close();

fin.close();

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

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