Работа с файлами
Для работы с файлами в стандартной библиотеке определен заголовочный файл 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
#include
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
Достарыңызбен бөлісу: |