Файловые потоки. Открытие и закрытие


Для работы с файлами в стандартной библиотеке определен заголовочный файл fstream, который определяет базовые типы для чтения и записи файлов. В частности, это:

ifstream: для чтения с файла

ofstream: для записи в файл

fstream: совмещает запись и чтение

Для работы с данными типа wchar_t для этих потоков определены двойники:

wifstream

wofstream

wfstream

Открытие файла
При операциях с файлом вначале необходимо открыть файл с помощью функции open(). Данная функция имеет две версии:

open(путь)

open(путь, режим)

Для открытия файла в функцию необходимо передать путь к файлу в виде строки. И также можно указать режим открытия. Список доступных режимов открытия файла:

ios::in: файл открывается для ввода (чтения). Может быть установлен только для объекта ifstream или fstream

ios::out: файл открывается для вывода (записи). При этом старые данные удаляются. Может быть установлен только для объекта ofstream или fstream

ios::app: файл открывается для дозаписи. Старые данные не удаляются.

ios::ate: после открытия файла перемещает указатель в конец файла

ios::trunc: файл усекается при открытии. Может быть установлен, если также установлен режим out

ios::binary: файл открывается в бинарном режиме

Если при открытии режим не указан, то по умолчанию для объектов ofstream применяется режим ios::out, а для объектов ifstream - режим ios::in. Для объектов fstream совмещаются режимы ios::out и ios::in.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::ofstream out; // поток для записи
out.open("D:\\hello1.txt"); // окрываем файл для записи

std::ofstream out2;
out2.open("D:\\hello2.txt", std::ios::app); // окрываем файл для дозаписи

std::ofstream out3;
out2.open("D:\\hello3.txt", std::ios::out | std::ios::trunc); // установка нескольких режимов

std::ifstream in; // поток для чтения
in.open("D:\\hello4.txt"); // окрываем файл для чтения

std::fstream fs; // поток для чтения-записи
fs.open("D:\\hello5.txt"); // окрываем файл для чтения-записи
Однако в принципе необязательно использовать функцию open для открытия файла. В качестве альтернативы можно также использовать конструктор объектов-потоков и передавать в них путь к файлу и режим открытия:

1
2
fstream(путь)
fstream(путь, режим)
При вызове конструктора, в который передан путь к файлу, данный файл будет автоматически открываться:

1
2
3
std::ofstream out("D:\\hello.txt");
std::ifstream in("D:\\hello.txt");
std::fstream fs("D:\\hello.txt", std::ios::app);
Вообще использование конструкторов для открытия потока является более предпочтительным, так как определение переменной, представляющей файловой поток, уже преполагает, что этот поток будет открыт для чтения или записи. А использование конструктора избавит от ситуации, когда мы забудем открыть поток, но при этом начнем его использовать.

В процессе работы мы можем проверить, окрыт ли файл с помощью функции is_open(). Если файл открыт, то она возвращает true:

1
2
3
4
5
6
std::ifstream in; // поток для чтения
in.open("D:\\hello.txt"); // окрываем файл для чтения
// если файл открыт
if (in.is_open())
{
}
Закрытие файла
После завершения работы с файлом его следует закрыть с помощью функции close(). Также стоит отметить, то при выходе объекта потока из области видимости, он удаляется, и у него автоматически вызывается функция close.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <fstream>

int main()
{
std::ofstream out; // поток для записи
out.open("D:\\hello.txt"); // окрываем файл для записи
out.close(); // закрываем файл

std::ifstream in; // поток для чтения
in.open("D:\\hello.txt"); // окрываем файл для чтения
in.close(); // закрываем файл

std::fstream fs; // поток для чтения-записи
fs.open("D:\\hello.txt"); // окрываем файл для чтения-записи
fs.close(); // закрываем файл

return 0;
}
Стоит отметить, что при компиляции через g++ следует использовать флаг -static, если программа работает со файлами и использует типы из заголовочного файла fstream:

g++ app.cpp -o app -static