C++
Файловый ввод-вывод в C++: ifstream, ofstream и чтение строк
Файловый ввод-вывод в C++ делают через заголовок <fstream>. Для чтения файла используют std::ifstream, для записи — std::ofstream, а для чтения и записи в одном потоке — std::fstream
Коротко:
#include <fstream>
std::ifstream— input file stream, чтение;std::ofstream— output file stream, запись;std::fstream— чтение и запись.
Записать текст в файл
#include <fstream>
#include <iostream>
int main() {
std::ofstream file("data.txt");
if (!file) {
std::cout << "Не удалось открыть файл для записи\n";
return 1;
}
file << "Hello, file!\n";
file << "Second line\n";
return 0;
}
После запуска рядом с программой появится файл data.txt. Если файл уже существовал, обычный std::ofstream file("data.txt") перезапишет его
Добавить данные в конец файла
Чтобы не перезаписывать файл, а дописывать в конец, используйте режим std::ios::app:
std::ofstream file("log.txt", std::ios::app);
file << "Новая строка лога\n";
Такой режим удобен для логов и истории действий
Прочитать файл построчно
#include <fstream>
#include <iostream>
#include <string>
int main() {
std::ifstream file("data.txt");
if (!file) {
std::cout << "Файл не найден\n";
return 1;
}
std::string line;
while (std::getline(file, line)) {
std::cout << line << "\n";
}
return 0;
}
std::getline читает целую строку до перевода строки. Это хороший вариант для текстовых файлов
Прочитать числа из файла
Если в файле лежат числа:
10 20 30
их можно читать через оператор >>:
#include <fstream>
#include <iostream>
int main() {
std::ifstream file("numbers.txt");
int value;
while (file >> value) {
std::cout << value * 2 << "\n";
}
return 0;
}
Цикл работает, пока удается прочитать очередное число
Прочитать весь файл в строку
Иногда файл нужно загрузить целиком, например для простого анализа текста:
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::ifstream file("data.txt");
if (!file) {
std::cout << "Файл не открыт\n";
return 1;
}
std::ostringstream buffer;
buffer << file.rdbuf();
std::string content = buffer.str();
std::cout << content << "\n";
return 0;
}
Для маленьких текстовых файлов это удобно. Для больших файлов лучше читать частями или построчно, чтобы не загружать все содержимое в память
Текстовый и бинарный режим
Для обычного текста чаще достаточно стандартного режима. Если вы работаете с изображениями, архивами или другими бинарными данными, открывайте файл с std::ios::binary:
std::ifstream file("image.bin", std::ios::binary);
Бинарный режим помогает избежать преобразований перевода строки и нужен для корректной работы с байтами
Где программа ищет файл
Относительный путь вроде "data.txt" считается относительно рабочей директории процесса, а не всегда относительно файла main.cpp. В IDE это часто путает новичков
Если программа не находит файл:
- проверьте рабочую директорию запуска;
- попробуйте временно указать абсолютный путь;
- выведите диагностическое сообщение;
- убедитесь, что имя файла написано без ошибки.
Закрывать ли файл вручную
Обычно файл закрывается автоматически, когда объект ifstream или ofstream выходит из области видимости. Но можно закрыть явно:
file.close();
Явное закрытие полезно, если вы хотите сразу освободить файл или проверить состояние после записи
Частые ошибки
Не проверять открытие файла
Перед чтением или записью проверяйте поток:
if (!file) {
std::cout << "Ошибка открытия\n";
}
Думать, что файл ищется рядом с исходником
IDE может запускать программу из папки сборки. Поэтому файл рядом с main.cpp может быть не найден
Путать getline и оператор >>
>> читает до пробела, а getline читает всю строку. Для текста с пробелами нужен getline
Короткий вывод
Для файлового ввода-вывода в C++ используйте <fstream>. Для записи берите std::ofstream, для чтения — std::ifstream. Всегда проверяйте, что файл открылся, и учитывайте рабочую директорию запуска
Связанные материалы:
Что почитать дальше по C++
Если нужен общий маршрут по теме, откройте рубрику C++. Для соседних задач пригодятся эти разборы:
- C++ с нуля: первый файл, переменные и вывод
- Enter в C++: перенос строки, std::endl и ввод через cin
- Microsoft Visual C++ 14.0: что это, зачем нужен и как исправить ошибку установки
- Microsoft Visual C++ Runtime Library ошибка: как исправить без скачивания DLL