Тема 9.3. Работа с файлами средствами языка C++

В С++ для работы с потоками ввода вывода существует библиотека iostream.h. В этой библиотеке представлены следующие классы:

  • Класс streambuf предоставляет память для буфера, а также методы для его наполнения, доступа к содержимому, сброса буфера и управления памятью буфера.
  • Класс ios_base предоставляет общие средства потока, такие как признак того, открыт ли поток для чтения, и является ли он бинарным или текстовым.
  • Класс ios базируется на ios_base и включает член-указатель на объект касса streamuf.
  • Класс ostream наследуется от ios и предоставляет методы вывода.
  • Класс istream наследуется от ios и предоставляет методы ввода.
  • Класс iostream базируется на кассах istream и ostream и потому наследует и методы вывода, и методы ввода.

Можно переопределить операцию вывода в поток следующим образом:

Далее представлена реализация класса.

Следует отметить тот факт, что дружественная функция, реализующая переопределение вывода в поток возвращает ссылку на объект класса ostream это необходимо для того, чтобы имелась возможность выводить нечто вроде следующего:

cout << "Время поездки : "<< trip << " (вторник) \n" ;

Если бы функция, переопределяющая операцию вывода в поток возвращала результат другого типа, то выполнение данной строки привело бы к ошибке. Пусть описание функции имеет вид:

void operator<< (ostream & os, cons t Time & t)

Тогда результатом выполнения строки

cout << trip;

будет безтиповое выражение, а значит попытка вывести в него что-то еще (следующий оператор <<) приведет к ошибке, ведь это уже не поток вывода.

Методы класса ostream

Класс ostream содержит методы put(символ) и write(строка) для вывода символов и строк соответственно. То есть, следующие две команды равносильны:

cout << "This is line of text";
cout.write("This is line of text");

Метод width(целое) устанавливает для одной следующей операции вывода ширину вывода. Таким образом этот метод может использоваться для организации вывода с фиксированным размером зоны отображения.

Метод fill(символ) устанавливает символ-заполнитель. По умолчанию это пробел. В отличие от width(целое) изменение действует до тех пор, пока символ не будет изменен вновь.

Метод precision(целое) устанавливает точность вывода чисел, то есть количество цифр после десятичной запятой.

Файловый поток вывода

Для того, чтобы выводить в файловый поток, необходимо выполнить следующее:

  1. Создать объект ofstream для управления выходным потоком.
  2. Ассоциировать этот объект с конкретным файлом.
  3. Использовать объект тем же способом, как используется cout. Единственным отличием будет то, что вывод направляется в файл вместо экрана.
#include <iostream>
#include <fstream>
using namespace std;

int main()
{

    std::ofstream file_out("myfile.txt");
   
    file_out << "TEXT to file";

    file_out.close();
  
    return 0;
}