Файлы в C++: от новичка до профи за 20 минут

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Файлы в C++: от новичка до профи за 20 минут

Представь, что твоя программа — это отличный повар. Она умеет готовить, но все ингредиенты нужно приносить вручную, а рецепты исчезают после каждого использования. Звучит не очень, правда? Именно поэтому любой уважающий себя разработчик должен уметь работать с файлами и файловой системой. В C++ это не просто «можно» — это база, без которой ты как программист будешь чувствовать себя неуверенно.

Сегодня мы разберем работу с файлами в C++ так, чтобы ты не просто скопировал код, а реально понял, что происходит под капотом. Без скучных лекций, с живыми примерами и практическими советами. Поехали!

Потоки — основа работы с файлами в C++

В C++ работа с файлами строится вокруг потоков. Если ты уже знаком с cout и cin, считай, что полдела сделано. Файловые потоки работают по тому же принципу, только вместо экрана или клавиатуры данные отправляются в файл или загружаются из него.

Главные игроки на поле:

  • ifstream — для чтения из файла (input file stream).
  • ofstream — для записи в файл (output file stream).
  • fstream — универсальный поток для чтения и записи.

Все эти классы живут в заголовочном файле <fstream>. Не забудь его подключить, иначе компилятор на тебя обидится.

Как открыть файл и не сойти с ума

Открытие файла в C++ — это как открытие двери: нужно знать, куда идти и зачем. Давай посмотрим на простой пример открытия файла для записи:

#include <iostream>
#include <fstream>
#include <string>

int main() {
    std::ofstream outFile("example.txt"); // Открываем файл для записи
    
    if (outFile.is_open()) {
        outFile << "Привет, файл!" << std::endl;
        outFile << "Это вторая строка." << std::endl;
        outFile.close(); // Закрываем файл
        std::cout << "Запись выполнена успешно!" << std::endl;
    } else {
        std::cerr << "Не удалось открыть файл!" << std::endl;
    }
    
    return 0;
}

Обрати внимание: мы всегда проверяем, открылся ли файл, с помощью is_open(). Если файла не существует, ofstream создаст его автоматически. А если не получается (например, нет прав на запись), программа не упадет, а сообщит об ошибке.

Режимы открытия: когда одного мало

По умолчанию ofstream перезаписывает файл, а ifstream только читает. Но что, если ты хочешь дописать данные в конец файла? Или открыть файл для чтения и записи одновременно? Тут на помощь приходят флаги режимов:

  • std::ios::in — открыть для чтения.
  • std::ios::out — открыть для записи (по умолчанию для ofstream).
  • std::ios::app — дописывать в конец файла (append).
  • std::ios::ate — переместить курсор в конец при открытии.
  • std::ios::binary — открыть в бинарном режиме.

Пример использования режимов:

std::ofstream logFile("log.txt", std::ios::app); // Дописываем в конец
if (logFile.is_open()) {
    logFile << "Новая запись в логе" << std::endl;
    logFile.close();
}

А если нужно и читать, и писать — используй fstream с комбинированными флагами:

std::fstream file("data.txt", std::ios::in | std::ios::out);

Чтение из файла: по словам и по строкам

Чтение из файла в C++ — это отдельное искусство. Можно читать по словам, по строкам, по символам. Выбор зависит от задачи.

Чтение по строкам (самый популярный способ)

#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::ifstream inFile("example.txt");
    std::string line;
    
    if (inFile.is_open()) {
        while (std::getline(inFile, line)) {
            std::cout << line << std::endl;
        }
        inFile.close();
    }
    return 0;
}

Функция getline() читает строку до символа новой строки. Удобно, когда нужно обработать текстовый файл построчно.

Чтение по словам

std::ifstream inFile("words.txt");
std::string word;

while (inFile >> word) {
    std::cout << word << std::endl;
}

Оператор >> пропускает пробелы и читает слова по отдельности. Идеально для парсинга.

Чтение всего файла целиком

Иногда нужно загрузить весь файл в память. Для этого можно использовать rdbuf():

std::ifstream inFile("big.txt");
std::string content((std::istreambuf_iterator<char>(inFile)), 
                    std::istreambuf_iterator<char>());

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

Запись в файл: просто и со вкусом

С записью все еще проще, чем с чтением. Главное — не забыть закрыть файл после работы. Хотя деструктор сделает это за тебя, лучше быть аккуратным.

std::ofstream outFile("output.txt");
outFile << "Числа: " << 42 << " и " << 3.14 << std::endl;
outFile << "Форматированный вывод: " << std::hex << 255 << std::endl;
outFile.close();

Обрати внимание: можно использовать std::hex, std::oct и другие манипуляторы прямо в потоке. C++ дает полный контроль над форматированием.

Работа с бинарными файлами

Текстовые файлы — это круто, но иногда нужно сохранить данные в том виде, в котором они лежат в памяти. Например, структуры или массивы чисел. Для этого используй бинарный режим:

#include <fstream>

struct Point {
    int x;
    int y;
};

int main() {
    Point p1 = {10                

Блоги

Рекомендаций по книгам