Надёжность · Ошибки, файлы, тесты

Файлы

std::filesystem и потоки: читаем и пишем данные

~30 мин 7 шагов

После урока ты сможешь

  • Читать файл построчно и записывать результат
  • Работать с путями через std::filesystem
  • Корректно обрабатывать отсутствие файла

Шаг 1 из 7

Файл — это тоже поток

Работа с файлами в C++ устроена так же, как с std::cin и std::cout, только поток подключён не к клавиатуре, а к файлу. Всё нужное лежит в <fstream>:

  • std::ofstream — запись в файл (output file stream);
  • std::ifstream — чтение из файла (input file stream).
main.cpp
#include <fstream>
#include <print>
#include <string>
​
int main() {
    {
        std::ofstream out("notes.txt");
        out << "купить хлеб\n";
        out << "позвонить маме\n";
        std::println(out, "записать {} дела", 3);   // println умеет писать в поток
    }   // out уничтожен — файл закрыт и записан на диск
​
    std::ifstream in("notes.txt");
    std::string line;
    int number = 0;
    while (std::getline(in, line)) {
        std::println("{}. {}", ++number, line);
    }
}

Всё, что ты знаешь про >>, getline и чтение в цикле, работает и с файлами. А закрывать файл вручную не нужно: деструктор потока сделает это сам. Это RAII.

Проверь себя

Программа пишет в std::ofstream out("a.txt") и сразу, не выходя из блока, читает этот файл через ifstream. Файл часто оказывается пустым. Почему?