Обработка файлов в потоковом режиме
Цель лекции: изучить организацию потокового ввода-вывода в файлы, научиться решать задачи с использованием прямого доступа к данным файла на языке C++.
Для работы с файлами используются специальные типы данных, называемые потоками.
Поток ifstream служит для работы с файлами в режиме чтения.
Поток ofstream служит для работы с файлами в режиме записи.
Поток fstream служит для работы с файлами в режиме как чтения, так и записи.
В программах на C++ при работе с текстовыми файлами в потоковом режиме необходимо подключать библиотеки iostream и fstream.
Функция открытия файла
Для того чтобы начать работать с текстовым файлом, необходимо описать переменную типа ofstream.
Например, с помощью оператора
ofstream F;
будет создана переменная F для записи информации в файл.
На следующем этапе файл необходимо открыть для записи. В общем случае оператор открытия файла будет иметь вид:
F.open("file", mode);
где F – переменная, описанная как ofstream;
file – полное имя файла на диске;
mode – режим работы с открываемым файлом.
Существуют следующие режимы для открытия файла.
Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока:
ios::in – для потоков ifstream,
ios::out – для потоков ofstream.
После удачного открытия файла (в любом режиме) в переменной F будет храниться 1 (true), в противном случае 0 (false). Это позволит проверять корректность операции открытия файла.
Если открытие файла завершилось неудачей, объект, соответствующий потоку, будет возвращать значение 0:
if (!ofs){ cout << "Файл не открыт\n"; }
Проверить успешность открытия файла можно также с помощью функции is_open(), имеющей следующий прототип:
Функция возвращает 1, если поток удалось связать с открытым файлом. Например,
if (!ofs.is_open()) cout << "Файл не открыт\n";
Открыть файл в режиме записи можно одним из следующих способов:
Первый способ
ofstream F; F.open("abc.txt", ios::out);
Второй способ, режим ios::out является режимом по умолчанию для потока ofstream
ofstream F; F.open("abc.txt");
Третий способ объединяет описание переменной типа поток и открытие файла в одном операторе.
ofstream F("abc.txt", ios::out);
После открытия файла в режиме записи, будет создан пустой файл, в который можно будет записывать информацию. Если необходимо открыть существующий файл (при этом сохранить его содержимое), то в качестве режима следует использовать значение ios::app.
После открытия файла в режиме записи, в него можно писать точно так же, как и на экран, только вместо стандартного устройства вывода cout необходимо указать имя открытого для записи файла.
Например, для записи в поток F переменной a, оператор вывода будет иметь вид:
F << a;
Для последовательного вывода в поток G переменных b, c и d оператор вывода станет таким:
G << b << c << d;
Чтение из файла выполняется корректно до достижения конца файла. Для проверки, достигнут ли конец файла, можно использовать функцию
ios::eof(),
которая имеет прототип int eof();.
Данная функция возвращает 0, если конец файла не достигнут, и значение 1 при достижении конца файла.
Функция закрытия файла
Открытые на диске файлы после окончания работы с ними рекомендуется закрыть. Оператор закрытия файла будет иметь вид:
F.close;
где F – переменная для записи информации в файл.
Основные алгоритмы работы с файлами
Для записи данных в файл нужно выполнить:
- Описать переменную типа ofstream.
- Открыть файл для записи с помощью функции open.
- Вывести информацию в файл с помощью cout.
- Обязательно закрыть файл.
Для чтения данных из текстового файла нужно выполнить:
- Описать переменную типа ifstream.
- Открыть файл для чтения с помощью функции open.
- Считать информацию из файла с помощью cin при считывании каждой порции данных необходимо проверять, что чтение возможно.
- Закрыть файл.
Пример. Работа с файлом в потоковом режиме.
#include "stdafx.h" #include <iostream> using namespace std; #include <fstream> int _tmain(int argc, _TCHAR* argv[]){ int n = 50; char str[20]; // Открываем файл для вывода ofstream ofs("Test.txt"); // Проверка корректности открытия файла if (!ofs) cout << "Файл не открыт.\n"; else { ofs << "Hello!\n" << n; // Закрываем файл ofs.close(); } // Открываем тот же файл для ввода ifstream file("Test.txt"); // Проверка корректности открытия файла if (!file) cout << "Файл не открыт.\n"; else { file >> str >> n; cout << str << "\n" << n; // Закрываем файл file.close(); } system("pause"); return 0; }
Ключевые термины
Поток fstream – это поток для работы с файлами в режиме, как чтения, так и записи.
Поток ifstream – это поток для работы с файлами в режиме чтения.
Поток ofstream – это поток для работы с файлами в режиме записи.
Поток как тип данных – это тип, который описывает объекты, реализующие процесс ввода и вывода данных в файлы.
Режимы открытия файлов – это наборы допустимых действий с открываемыми в программе файлами.
Краткие итоги
- В С++ определен специальный тип данных – поток.
- Каждый из потоков: fstream, ifstream, ofstream – служит для работы с файлами в определенном режиме.
- Прототипы функций по работе с файлами в потоковом режиме находятся в стандартных библиотеках.
- Перед началом работы с файлом его необходимо открыть, указав режим открытия.
- Любой открытый в программе файл необходимо закрыть после использования.