Обработка файлов в потоковом режиме
Цель лекции: изучить организацию потокового ввода-вывода в файлы, научиться решать задачи с использованием прямого доступа к данным файла на языке 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 – служит для работы с файлами в определенном режиме.
- Прототипы функций по работе с файлами в потоковом режиме находятся в стандартных библиотеках.
- Перед началом работы с файлом его необходимо открыть, указав режим открытия.
- Любой открытый в программе файл необходимо закрыть после использования.