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 в блокноте, пока программа работает?
Открыть можно, но содержимое может оказаться неполным: часть данных еще лежит в буфере программы. Смотреть результат надежнее после ее завершения.



