Как читать из файла и писать в файл
Опишите файловую переменную типа text, свяжите её с именем файла (assign), откройте (reset — для чтения, rewrite — для записи), работайте как с клавиатурой и экраном и закройте (close).
Пример: в файле input.txt — числа, программа записывает их сумму в output.txt.
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:
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. Если вместо русских букв видны непонятные символы, дело в кодировке. Числа и латинские буквы от этого не страдают.
Частые ошибки
- Файла нет.
resetдля несуществующего файла останавливает программу: в Free Pascal —Runtime error 2, в PascalABC.NET — с сообщением, что файл не найден. - Забыли
close. Записанное в файл может не попасть на диск целиком — последние строки пропадут. - Забыли
resetилиrewrite. Чтение или запись в неоткрытый файл — ошибка при выполнении. - Расширение скрыто. В Windows файл может называться
input.txt.txt, если в Проводнике скрыты расширения. Включите показ расширений и проверьте имя.
На олимпиадах и в проверяющих системах
Часто данные читают из input.txt, а ответ пишут в output.txt. Можно не менять всю программу, а перенаправить стандартный ввод и вывод: assign(input, 'input.txt'); reset(input); и assign(output, 'output.txt'); rewrite(output); в начале программы — дальше обычные readln и writeln работают с файлами. В конце закройте их: close(input); close(output);. Уточняйте правила конкретной системы: многие подают данные прямо на клавиатурный ввод, и тогда файлы не нужны.