Основы программирования на С++ для начинающих

Работа с файлами в C++. Часть 2 – Библиотека fstream.

Класс  ofstream

Обратный классу ifstream, который мы рассмотрели ранее, и призван для записи в файл.

Как и в ifstream, для открытия или создания файла используется конструктор или метод open().

Или конструктором:

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

За проверку на открытость файла отвечает все та же is_open()

Принцип тот же. Так же можно проверить открыт ли файл, использовав в  логическом выражении саму файловую переменную:

Оператор <<

Перенаправляет форматированный вывод в файл. Принцип тот же, что и у аналога из iostream.

Предназначен для вывода в текстовые файлы. Управляется операциями форматирования такими как width() или setf(). Их аналоги полностью равны одноименным методам из iostream.

Последовательность вывода переменных так же указывается слева на право: Первой будет выведена переменная, указана ближе всех к fileo, потом следующая за ней.

Оператор endl

Аналогично оператору из iostream производит запись перевода каретки на новую строку в текстовых файлах.

Метод write

Используется в бинарных файлах для записи блока памяти (массива байт) в файл как они есть. Любая переменная так же является массивом байт, вернее ее так можно рассматривать. Соответственно этот метод запишет в файл ее машинное представление (тот вид как она выглядит в памяти).

Этот метод принимает два параметра: Указатель на блок данных и количество байт, который этот блок занимает. В примере строка занимает strlen() байт, целое sizeof() (которое даст 4 на 32-х битных операционках для целого и 8 для вещественного).

Еще раз стоит акцентировать, что в отличии от форматированного вывода оператором <<,  метод write() не выводит данные в текстовом представлении.

Метод close

Закрывает файл метод close(). Для файлов, открытых на запись, в отличии от файлов на чтение, закрытие файла – обязательный ритуал. Незакрытый файл может не получить данные. Происходить такой эффект может из-за буфферизации самой операционки, когда данные, сбрасываемые в файл, хранятся на самом деле в памяти  и сразу в файл не поступают. Операционная система сама решает, когда пора данные сливать.

Такой “отложенный” слив называется “Коммитом” (от латинского commit). Кстати этим эффектом весьма удачно пользуются системы управления базами данных, где  вставляемые записи попадают в хранилище в памяти (называемой транзакцией). И только после специальной команды скопом пишутся в сам файл базы. Метод close() как раз пример такой команды закрывающей транзакцию вместе с файлом.

Стоит на всякий случай упомянуть, что если нужно произвести коммит данных без закрытия самого файла, нужно применить метод flush()

Отложенные на запись данные поступят в файл, но он еще будет открыт для записи. Этот метод не так часто используется, но о нем знать полезно.

Методы форматирования width, precision

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

width() указывает ширину в символах, в которое будет укладываться выводимое значение, а precision() количество знаков дробной части вещественного. Простейший пример: вывод таблицей в текстовый файл значений тригонометрической функции:

Методы позиционирования seekp, tellp

Для перехода по файлу как и в случае с ifstream существует функция перестановки позиции. Называется она seekp() и получает те же параметры что и описаны выше для seekg().

Для получения текущей позиции в байтах от начала файла используется аналогичная функция tellp().

Видео о работе с файлами в С++:

29 thoughts on “Работа с файлами в C++. Часть 2 – Библиотека fstream.

  1. Написал я программу, которая выводит в текстовый файл всякую нужную информацию, которую потом можно скопировать и вставить в матлаб, чтобы построить график. Я решил так сделать, потому что для Visual Studio у меня стоит очень нужное расширение, а пытаться искать в инете инфу о том, как строить графики в VS на C++ мне лень. Вот я протестировал получившуюся программу и вижу, что файле у меня отобразилась только последняя строка. Когда я закомментировал ту часть кода, которая выводит эту строку, у меня не вывелось ничего. Короче, либо я тупой, либо автор статьи что-то не дописал.

  2. (Дополнение к предыдущему комментарию) Во время открытия файла, в который всё это печатается, я также, как и на примере в этой статье, написал “ios_base::app”.

  3. Если закомментировать “ios_base::app”, то результат будет такой же, вот только перед этой же самой строкой будет огромная куча пробелов ахахахах

    1. char* str1 = “Hello”;
      char* str2 = “world!”;

      int main() {
      ifstream file(“file.txt);
      if (!file.is_open) {
      std::cerr << "Cannot open the file" << std::endl;
      return 1;
      }
      file << str1 << ", " << str2 << std::endl;
      file.close();
      return 0;
      }

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *