Ввод-вывод в файлы в C++: чтение и запись с fstream
До сих пор мы использовали стандартную библиотеку iostream, предоставляющую cin и cout для чтения из стандартного ввода и записи в стандартный вывод.
Это руководство научит читать и писать в файл. Для этого нужна другая стандартная библиотека C++ — fstream, определяющая три новых типа данных:
| № | Тип данных и описание |
|---|---|
| 1 | ofstream Представляет выходной файловый поток, используется для создания файлов и записи информации в файлы. |
| 2 | ifstream Представляет входной файловый поток, используется для чтения информации из файлов. |
| 3 | fstream Представляет файловый поток вообще, обладает возможностями и |
Для файловых операций в C++ в исходный файл нужно включить заголовочные файлы <iostream> и <fstream>.
Открытие файла
Файл должен быть открыт перед чтением или записью. Для записи можно использовать объект ofstream или fstream. Для чтения — объект ifstream.
Стандартный синтаксис функции open(), члена fstream, ifstream, ofstream:
void open(const char *filename, ios::openmode mode);
Первый аргумент — имя и расположение файла. Второй аргумент — режим открытия.
| № | Флаг режима и описание |
|---|---|
| 1 | ios::app Режим добавления. Все выходные данные дописываются в конец файла. |
| 2 | ios::ate Открыть файл для вывода и переместить указатель чтения/записи в конец файла. |
| 3 | ios::in Открыть файл для чтения. |
| 4 | ios::out Открыть файл для записи. |
| 5 | ios::trunc Если файл уже существует, его содержимое усекается перед открытием. |
Можно комбинировать флаги через побитовое ИЛИ. Например, открыть для записи с усечением:
ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc);
Аналогично, для чтения и записи:
fstream afile;
afile.open("file.dat", ios::out | ios::in);
Закрытие файла
При завершении программы C++ автоматически сбрасывает все потоки, освобождает память и закрывает открытые файлы. Но хорошей практикой является явное закрытие всех открытых файлов перед завершением.
Синтаксис функции close() (член fstream, ifstream, ofstream):
void close();
Запись в файл
При программировании на C++ запись информации в файл из программы осуществляется через оператор вставки в поток (<<), точно так же как вывод на экран. Разница лишь в том, что используется объект ofstream или fstream вместо cout.
Чтение из файла
Чтение информации из файла в программу делается через оператор извлечения из потока (>>), как и ввод с клавиатуры. Разница: используется объект ifstream или fstream вместо cin.
Пример чтения и записи
Программа открывает файл в режиме чтения и записи. После записи пользовательских данных в файл afile.dat, читает из файла и выводит на экран:
#include <fstream>
#include <iostream>
using namespace std;
int main() {
char data[100];
// открытие в режиме записи
ofstream outfile;
outfile.open("afile.dat");
cout << "Writing to the file" << endl;
cout << "Enter your name: ";
cin.getline(data, 100);
// запись введённых данных в файл
outfile << data << endl;
cout << "Enter your age: ";
cin >> data;
cin.ignore();
// снова запись
outfile << data << endl;
// закрытие файла
outfile.close();
// открытие в режиме чтения
ifstream infile;
infile.open("afile.dat");
cout << "Reading from the file" << endl;
infile >> data;
// вывод на экран
cout << data << endl;
// снова чтение и вывод
infile >> data;
cout << data << endl;
// закрытие
infile.close();
return 0;
}
Пример ввода/вывода:
$ ./a.out Writing to the file Enter your name: Zara Enter your age: 9 Reading from the file Zara 9
Пример использует дополнительные функции cin: getline() для чтения строки и ignore() для игнорирования лишних символов после предыдущего чтения.
Указатели позиции в файле
И istream, и ostream предоставляют функции-члены для перемещения указателя позиции в файле. Это seekg («seek get») для istream и seekp («seek put») для ostream.
Аргумент seekg и seekp — обычно длинное целое. Второй аргумент может указывать направление поиска: ios::beg (по умолчанию) — относительно начала потока, ios::cur — относительно текущей позиции, ios::end — относительно конца потока.
Указатель позиции — целое число, задающее положение в файле в байтах от начала. Примеры позиционирования указателя «get»:
// позиция на n-й байт файла (предполагается ios::beg) fileObject.seekg(n); // n байт вперёд от текущей позиции fileObject.seekg(n, ios::cur); // n байт назад от конца файла fileObject.seekg(n, ios::end); // позиция в конце файла fileObject.seekg(0, ios::end);
Язык C
- Освоение переменных, литералов и констант в C++: подробное руководство
- Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
- Дружественные функции и классы в C++: мастерство контроля доступа
- Работа с файлами в C: мастерство ввода-вывода с fopen, fprintf, fread и fseek
- Управление директориями и файлами в Python: полное руководство
- Структуры C++ против классов: практическое руководство для разработчиков встроенных систем
- Заголовочные файлы в C: типы, подключение и лучшие практики
- Полное руководство по дате и времени в C++
- Перегрузка в C++: функции и операторы — подробное руководство
- Штуцерная напильник: полное руководство по незаменимому инструменту для дерева и металла