Input.txt и output.txt: что это за текстовые файлы и как с ними работать

Input.txt и output.txt: что это за текстовые файлы и как с ними работать Полезное

Input.txt и output.txt — это обычные текстовые файлы с условными именами: из input.txt программа читает исходные данные, в output.txt записывает ответ. Сами имена ничего не значат для операционной системы — это договоренность, принятая в учебных задачах, олимпиадах и автоматических проверяющих системах.

Ниже — что считается текстовым файлом, один и тот же пример на Pascal, C++ и Python и разбор типичных ошибок: имя, папка, кодировка, перевод строки. Примеры проверены 30.09.2026 на Free Pascal 3.2.2, Apple clang 21 (стандарт C++20) и Python 3.14.

Что такое текстовый файл и при чем тут txt

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

  • расширение .txt — часть имени, подсказка для ОС, какой программой открыть файл; содержимое оно не меняет;
  • кодировка — правило перевода байтов в символы (UTF-8, Windows-1251);
  • перевод строки — служебные байты между строками: LF в Linux и macOS, пара CR LF в Windows.

Файл с числами 5 и 3 8 -2 10 4 в двух строках — текстовый: его можно открыть в блокноте и прочитать глазами. Файл .exe или .png — двоичный: его байты не являются символами текста.

Зачем задачам input.txt и output.txt

Проверяющая система запускает программу много раз на разных тестах. Ей удобно положить рядом с программой файл с входными данными, дождаться завершения и сравнить файл с ответом с эталоном. Отсюда требования в условии: «ввод — input.txt, вывод — output.txt».

Это один из двух распространенных способов. Второй — стандартный ввод и вывод (клавиатура и экран, они же stdin и stdout). Какой способ нужен, всегда написано в условии конкретной задачи: если система ждет ответ в output.txt, а программа печатает его на экран, решение не засчитают.

Один пример на трех языках

Задача: в первой строке input.txt записано количество чисел n, во второй — сами числа через пробел. В output.txt нужно вывести их сумму. Создайте в папке с программой файл input.txt:

5
3 8 -2 10 4

После запуска любой из трех программ рядом появится output.txt с одной строкой 23.

Pascal

program SumFromFile;
var
  n, i, x: LongInt;
  total: Int64;
begin
  Assign(Input, 'input.txt');
  Reset(Input);
  Assign(Output, 'output.txt');
  Rewrite(Output);

  total := 0;
  ReadLn(n);
  for i := 1 to n do
  begin
    Read(x);
    total := total + x;
  end;
  WriteLn(total);

  Close(Input);
  Close(Output);
end.

Assign связывает файловую переменную с именем файла на диске, Reset открывает файл для чтения, Rewrite — для записи (существующий файл при этом очищается). Input и Output — стандартные файловые переменные: после переназначения обычные Read и WriteLn работают уже с файлами, а не с клавиатурой и экраном.

Тип LongInt выбран не случайно: в режиме Free Pascal по умолчанию Integer занимает 16 бит и вмещает числа только до 32767.

C++

#include <fstream>
#include <iostream>

int main() {
    std::ifstream fin("input.txt");
    if (!fin.is_open()) {
        std::cerr << "Не найден input.txt в текущей папке\n";
        return 1;
    }

    int n = 0;
    long long total = 0;
    if (!(fin >> n)) {
        std::cerr << "Первая строка input.txt не читается как число\n";
        return 1;
    }
    for (int i = 0; i < n; ++i) {
        int x = 0;
        if (!(fin >> x)) {
            std::cerr << "Чисел в файле меньше, чем заявлено\n";
            return 1;
        }
        total += x;
    }

    std::ofstream fout("output.txt");
    fout << total << '\n';
    return 0;
}

std::ifstream — поток чтения из файла, std::ofstream — поток записи. С ними работают так же, как с std::cin и std::cout. Закрывать потоки вручную не обязательно: они закрываются сами при выходе из main. Каждое чтение проверяется: без этих проверок программа на испорченном файле молча записала бы в output.txt неверное число.

В олимпиадном коде встречается и другой прием — std::freopen("input.txt", "r", stdin) и std::freopen("output.txt", "w", stdout). Он перенаправляет стандартные потоки в файлы, и дальше программа пользуется обычными std::cin и std::cout.

Python

with open("input.txt", encoding="utf-8-sig") as fin:
    n = int(fin.readline())
    numbers = [int(part) for part in fin.readline().split()]

if len(numbers) != n:
    raise SystemExit(f"Ожидалось чисел: {n}, в файле: {len(numbers)}")

with open("output.txt", "w", encoding="utf-8", newline="\n") as fout:
    fout.write(f"{sum(numbers)}\n")

Конструкция with закрывает файл сама, даже если внутри блока случилась ошибка. Режим "w" создает файл или очищает существующий. Программа заодно сверяет количество чисел с заявленным: если во второй строке оставить три числа, она завершится с сообщением Ожидалось чисел: 5, в файле: 3. Программа на C++ в этом случае сообщит Чисел в файле меньше, чем заявлено. Учебная программа на Pascal такой проверки не делает: на файле с тремя числами из пяти Read в конце файла возвращает ноль, и в output.txt попадает сумма имеющихся чисел (9) без сообщения об ошибке.

Если не получилось: типичные ошибки

Симптом Причина Что делать
Pascal: Runtime error 2; Python: FileNotFoundError Файла нет в текущей рабочей папке Положить input.txt туда, откуда запускается программа
C++: в output.txt записан 0 Файл не открылся, а проверки нет Проверять is_open() сразу после открытия
Файл лежит рядом, но не находится Имя на самом деле input.txt.txt или Input.txt Включить показ расширений в проводнике, сверить регистр букв
Pascal: Runtime error 106; Python: ValueError на первом числе; C++: первое число не читается В начале файла метка BOM Сохранить файл как UTF-8 без BOM; в Python читать с utf-8-sig
Python: UnicodeDecodeError Кодировка файла не совпадает с указанной в open Назвать реальную кодировку файла
output.txt пустой Файл не закрыт, буфер не записан на диск Close в Pascal, with в Python

Имя и папка

Программа ищет input.txt не «рядом с исходником», а в текущей рабочей папке — той, из которой ее запустили. В среде разработки это часто папка проекта или папка сборки, а не папка с файлом кода. Проводник Windows по умолчанию скрывает расширения, поэтому файл, названный в блокноте input.txt, легко оказывается input.txt.txt.

В Linux, где обычно работают проверяющие системы, регистр букв в именах значим: Input.txt и input.txt — разные файлы.

Отдельно опасен C++ без проверки открытия. Вот программа, запущенная в папке, где input.txt нет:

#include <fstream>

int main() {
    std::ifstream fin("input.txt");
    std::ofstream fout("output.txt");
    int a = 0, b = 0;
    fin >> a >> b;
    fout << a + b << '\n';
}

Она завершается без единого сообщения и с кодом возврата 0, а в output.txt оказывается 0: чтение из неоткрытого потока ничего не меняет в переменных. Исправление — проверка is_open(), как в основном примере.

Кодировка и BOM

Блокнот Windows умеет сохранять файл в варианте «UTF-8 со спецификацией»: в начало добавляются три служебных байта — метка BOM. Глазами ее не видно, но программа получает ее вместе с первым числом. Программа на Python, открывающая такой файл с encoding="utf-8", падает:

ValueError: invalid literal for int() with base 10: '\ufeff5\n'

Кодировка utf-8-sig из основного примера пропускает метку, если она есть, и читает файл без метки как обычный UTF-8. Программа на Free Pascal на таком же файле завершается с Runtime error 106 (неверный числовой формат). Программа на C++ из основного примера выводит Первая строка input.txt не читается как число и возвращает код 1; без проверки чтения она записала бы в output.txt ноль. Для Pascal и C++ исправление одно — сохранить файл без метки.

Если в файле русский текст в кодировке Windows-1251, а программа читает его как UTF-8, Python сообщает UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf in position 0. Исправление — указать encoding="cp1251". В Python 3.14 и более ранних open без параметра encoding берет кодировку из настроек системы, поэтому одна и та же программа ведет себя по-разному на разных компьютерах. В Python 3.15 (стабильный выпуск — октябрь 2026 года) умолчанием становится UTF-8. Указывайте кодировку явно — так программа одинаково работает на любой версии.

Перевод строки

Файл, созданный в Windows, заканчивает строки парой CR LF. Чтение чисел через Read, >> и split() от этого не страдает: все три основные программы на таком файле дают те же 23. Проблема появляется при чтении строк целиком в C++ на Linux или macOS: std::getline оставляет символ CR в конце строки. Для файла со строкой hello в формате Windows проверка показывает:

длина: 6
после очистки: 5

Шесть символов вместо пяти — это hello плюс невидимый \r. Сравнение такой строки с "hello" дает «не равно». Лишний символ убирают так:

if (!word.empty() && word.back() == '\r') word.pop_back();

Python в текстовом режиме сам приводит CR LF к \n при чтении.

Конец файла в Pascal: Eof и SeekEof

Когда количество чисел заранее неизвестно, файл читают до конца. Цикл while not Eof(f) do Read(f, x) на файле из строк 3 8 и 10 во Free Pascal дает лишнее число:

прочитано: 3
прочитано: 8
прочитано: 10
прочитано: 0
всего чисел: 4

После числа 10 в файле остается перевод строки, поэтому Eof еще возвращает False, а Read вместо числа получает ноль. Замена Eof(f) на SeekEof(f) исправляет результат: эта функция сначала пропускает пробелы и переводы строк. С ней программа выводит три числа и всего чисел: 3.

Вторая ловушка — незакрытый файл. Если открыть свою файловую переменную через Rewrite(f), записать в нее число и не вызвать Close(f), во Free Pascal 3.2.2 файл остается пустым: данные не успевают попасть из буфера на диск.

Выводы

  • input.txt и output.txt — обычные текстовые файлы; имена заданы условием задачи, а не языком или операционной системой.
  • В Pascal файлы подключают через Assign, Reset и Rewrite, в C++ — через std::ifstream и std::ofstream, в Python — через open внутри with.
  • Файл ищется в текущей рабочей папке; первым делом проверяйте точное имя, расширение и регистр букв.
  • Кодировку указывайте явно, а метку BOM либо не сохраняйте, либо читайте файл с utf-8-sig.
  • Открытие файла проверяйте в коде, а файл вывода закрывайте — иначе получите 0 или пустой output.txt без сообщения об ошибке.

Где применяется / связь с практикой

Освойте тему на практике

Чтение и запись файлов — первый шаг от учебных программ к настоящим: так же устроена работа с конфигурациями, журналами и выгрузками данных. В C++ к этому добавляются состояния потоков, двоичный режим и управление ресурсами. Эти темы последовательно разбирают на курсе C++-разработчик. Базовый уровень. Познакомиться с форматом занятий можно на открытых уроках Otus.

FAQ

Обязательно ли файлы должны называться input.txt и output.txt?
Нет. Имена задает условие задачи: встречаются и a.in с a.out, и произвольные имена. Проверяющая система ищет ровно то имя, которое указано в условии.

Что будет, если output.txt уже существует?
Rewrite в Pascal, std::ofstream в C++ и режим "w" в Python очищают файл и записывают данные заново. Чтобы дописывать в конец, нужны Append в Pascal, флаг std::ios::app в C++ и режим "a" в Python.

Можно ли открыть output.txt в блокноте, пока программа работает?
Открыть можно, но содержимое может оказаться неполным: часть данных еще лежит в буфере программы. Смотреть результат надежнее после ее завершения.

OTUS Журнал
Скидка 5% 12-19 октября на курсы (popup)
Бесплатные открытые уроки (поп-ап)