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

Как читать из файла и писать в файл

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

Опишите файловую переменную типа text, свяжите её с именем файла (assign), откройте (reset — для чтения, rewrite — для записи), работайте как с клавиатурой и экраном и закройте (close).

Пример: в файле input.txt — числа, программа записывает их сумму в output.txt.

Pascal
program FileSum;
var
  f, g: text;
  x, s: longint;
begin
  assign(f, 'input.txt');
  reset(f);
  s := 0;
  while not seekeof(f) do
  begin
    read(f, x);
    s := s + x;
  end;
  close(f);
  assign(g, 'output.txt');
  rewrite(g);
  writeln(g, 'Сумма: ', s);
  close(g);
end.

Файл input.txt:

Текст
10 20
30

После запуска в output.txt появится строка:

Текст
Сумма: 60

Что делает каждая команда

КомандаЧто делает
assign(f, 'имя.txt')связывает переменную f с файлом на диске
reset(f)открывает файл для чтения, с начала
rewrite(f)создаёт файл для записи; если файл был — стирает его содержимое
append(f)открывает файл для дописывания в конец
read(f, x), readln(f, s)читают из файла, как read и readln с клавиатуры
write(f, …), writeln(f, …)пишут в файл, как на экран
eof(f)истина, когда файл прочитан до конца
seekeof(f)то же, но сначала пропускает пробелы и переводы строк
close(f)закрывает файл

Первым параметром в read, write и других стоит файловая переменная. Без неё команда работает с клавиатурой и экраном, как обычно.

rewrite без предупреждения стирает всё, что было в файле. Чтобы добавить строки к существующему файлу, открывайте его через append.

eof или seekeof

Числа удобно читать циклом while not seekeof(f): seekeof пропускает пробелы и пустые строки, поэтому лишний перевод строки в конце файла не помешает. С eof такая пустая строка в конце приводит к ещё одному чтению — и к ошибке или лишнему нулю.

Строки текста читают через eof и readln:

Pascal
while not eof(f) do
begin
  readln(f, line);
  writeln(line);
end;

Здесь line — переменная типа string. Цикл выводит файл на экран строка за строкой.

Где лежит файл

Имя без пути — 'input.txt' — ищется в текущей папке. При запуске из PascalABC.NET и из командной строки это обычно папка, где лежит программа. Если файл не находится, положите его рядом с .pas и .exe или укажите полный путь: 'C:\Users\Имя\Documents\input.txt'.

Файл можно создать в Блокноте. Сохраняйте его как обычный текст (.txt).

Русские буквы в файлах зависят от кодировки. PascalABC.NET по умолчанию читает и пишет текстовые файлы в кодировке Windows-1251, а Блокнот и другие редакторы часто сохраняют в UTF-8. Если вместо русских букв видны непонятные символы, дело в кодировке. Числа и латинские буквы от этого не страдают.

Частые ошибки

На олимпиадах и в проверяющих системах

Часто данные читают из input.txt, а ответ пишут в output.txt. Можно не менять всю программу, а перенаправить стандартный ввод и вывод: assign(input, 'input.txt'); reset(input); и assign(output, 'output.txt'); rewrite(output); в начале программы — дальше обычные readln и writeln работают с файлами. В конце закройте их: close(input); close(output);. Уточняйте правила конкретной системы: многие подают данные прямо на клавиатурный ввод, и тогда файлы не нужны.