Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Industrial programming >> Язык C

Ввод-вывод в файлы в C++: чтение и запись с fstream

До сих пор мы использовали стандартную библиотеку iostream, предоставляющую cin и cout для чтения из стандартного ввода и записи в стандартный вывод.

Это руководство научит читать и писать в файл. Для этого нужна другая стандартная библиотека C++ — fstream, определяющая три новых типа данных:

№Тип данных и описание
1

ofstream

Представляет выходной файловый поток, используется для создания файлов и записи информации в файлы.

2

ifstream

Представляет входной файловый поток, используется для чтения информации из файлов.

3

fstream

Представляет файловый поток вообще, обладает возможностями и ofstream, и ifstream — может создавать файлы, писать и читать.

Для файловых операций в 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, читает из файла и выводит на экран:

Live Demo
#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

  1. Освоение переменных, литералов и констант в C++: подробное руководство
  2. Классы и объекты в C++: практическое руководство по объектно-ориентированному программированию
  3. Дружественные функции и классы в C++: мастерство контроля доступа
  4. Работа с файлами в C: мастерство ввода-вывода с fopen, fprintf, fread и fseek
  5. Управление директориями и файлами в Python: полное руководство
  6. Структуры C++ против классов: практическое руководство для разработчиков встроенных систем
  7. Заголовочные файлы в C: типы, подключение и лучшие практики
  8. Полное руководство по дате и времени в C++
  9. Перегрузка в C++: функции и операторы — подробное руководство
  10. Штуцерная напильник: полное руководство по незаменимому инструменту для дерева и металла