Глиф Учебники

Ввод из файла и вывод в файл

Справочник · C++ · 2 минуты чтения

Способов два. Для олимпиадной задачи хватит двух строк freopen в начале main — остальной код не меняется. Если программе нужны одновременно и файлы, и экран, берите файловые потоки ifstream и ofstream.

Какой способ выбрать

Олимпиадная задачаfreopen

Две строки в начале main:

C++
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);

    int a, b;
    cin >> a >> b;
    cout << a + b << "\n";
    return 0;
}

freopen подменяет стандартный ввод (stdin) файлом input.txt, а стандартный вывод (stdout) — файлом output.txt. Дальше cin и cout (и scanf, printf) работают с файлами, а остальной код остаётся прежним.

Прочитайте условие внимательно. Во многих проверяющих системах ввод идёт с клавиатуры (стандартный ввод), а файлы не нужны. Строки с freopen в такой задаче могут сломать решение. Если в условии указаны имена файлов — пишите ровно их.

Удобный приём при отладке: закомментировать строки freopen (//), чтобы вводить данные с клавиатуры, и вернуть их перед отправкой решения.

Дальше: «Файл не открывается»

Нужны и файлы, и экранifstream и ofstream

Способ C++ — файловые потоки из <fstream>. Работают так же, как cin и cout, только со своими именами:

C++
#include <fstream>
#include <iostream>
using namespace std;

int main() {
    ifstream fin("input.txt");
    if (!fin.is_open()) {
        cerr << "cannot open input.txt\n";
        return 1;
    }
    ofstream fout("output.txt");

    int n;
    fin >> n;
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        int x;
        fin >> x;
        sum += x;
    }
    fout << sum << "\n";
    return 0;
}
  • ifstream fin("input.txt") — открыть файл для чтения; fin >> n — как cin >> n.
  • ofstream fout("output.txt") — создать файл (или стереть старый) и писать в него; fout << x — как cout.
  • getline(fin, line) читает строку из файла.
  • Файлы закроются сами в конце main.

Этот способ удобен, когда в программе одновременно нужны и файлы, и экран: cout по-прежнему выводит в консоль.

ofstream при открытии стирает содержимое файла. Не указывайте в нём имя файла с данными, которые нужны. Дописать в конец существующего файла можно так: ofstream fout("log.txt", ios::app);.

Файл не открывается

Чаще всего программа ищет файл не там. Имя без пути ("input.txt") ищется в текущей папке — откуда программу запустили, а это не всегда папка с .cpp или .exe:

Если не уверены, положите input.txt рядом с программой и запустите её из командной строки из этой папки.

Другие причины:

Проверка if (!fin.is_open()) из примера выше сразу сообщит, что файл не найден, вместо того чтобы молча читать пустоту.