Текстовые файлы в Pascal

Обновлено: 28.04.2026

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

Данные, хранящиеся на внешних устройствах, организовываются в виде файлов. Под файлом понимается область памяти на внешнем запоминающем устройстве, содержащая определенную информацию. В эту конкретную область памяти можно как помещать данные (выполнять операции ввода, записи), так и извлекать их оттуда (операции вывода, чтения).

На диске любой файл хранится в двоичном (бинарном) виде. Однако программы интерпретируют их как текстовые или бинарные разных категорий.

Текстовые файлы состоят из символьных (буквенных) строк переменной длины. Каждая строка завершается специальной комбинацией "конец строки", которая состоит из двух символов: "перевод каретки" (ASCII-код #13) и "перевод строки" (#10).

Для работы с данными, хранящимися в файлах, в программах необходимо определять переменные файлового типа. Через них обеспечивается связь между файлом на диске и программой. Упрощая, сами такие переменные могут называть "файлами".

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

Для работы с текстовым файлом должна быть объявлена переменная типа Text:

var имя_переменной: Text;

Связь между файловой переменной и реальным файлом на диске устанавливается уже в разделе действий программы с помощью процедуры assign. Первым аргументом ей передается переменная, вторым — адресное имя файла.

Далее текстовый файл открывается либо на чтение, либо за запись, либо на дозапись в конец. Текстовые файлы нельзя одновременно читать и записывать их. Открытие на чтение — процедура reset, на запись — rewrite, на дозапись — append.

Если текстовый файл был открыт на чтение, то само чтение из него выполняется процедурами read и readln. В отличие от чтения с клавиатуры, при чтении из файла в качестве первого параметра указывают имя файловой переменной, далее через запятую перечисляются переменные, в которые осуществляется чтение данных из файла.

В случае открытия на запись действие выполняется с помощью write и writeln.

После того как работа с файлом заканчивается, его следует закрыть и "освободить" связанную с ним переменную. Это делается с помощью процедуры close.

Представим, что в том же каталоге, что и файл программы на Паскале, имеется текстовый файл info.txt с таким содержимым:

Hello World!
42 306 1024

Чтобы прочитать его и вывести содержимое на экран, напишем такой код:

var
    t: text;
    data: string;

begin
    assign(t, 'info.txt');  // связь между переменной и файлом
    reset(t);  // открытие файла на чтение
    readln(t, data);  // чтение строки из файла в строковую переменную
    writeln(data);  // можно делать с данными что угодно
    close(t);  // закрытие файла
end.

Однако при его выполнении на экран будет выведена только первая строка файла:

Hello World!

Дело все в том, что когда выполняется reset неявно создается так называемый курсор, который устанавливается перед первым символом файла, а при чтении смещается. Readln устроена таким образом, что читает данные только до конца текущей строки. После этого переводит курсор на новую строку. Поэтому если мы хотим прочитать две строчки текста, то в нашем коде должно быть два вызова readln:

readln(t, data);
writeln(data); 
readln(t, data);
writeln(data);

Зная заранее сколько в текстовом файле строчек, мы могли бы написать цикл построчного чтения. Количество его повторов было бы равно количеству строк. Однако обычно мы этого не знаем. Чтобы разрешить эту проблему, в языке программирования Pascal предусмотрена функция eof, которая запрашивает у операционной системы, соответствует ли текущее положение курсора размеру файла. Если да, то функция возвращает истину (True). Тогда цикл построчного чтения файла может выглядеть так:

while not eof(t) do begin
    readln(t, data);
    writeln(data); 
end;

Мы исходим от обратного: "пока нет признака конца файла, продолжать чтение".

Напишите программу, которая подсчитывает количество строк в файле и выводит это значение на экран.

В ряде других языков программирования считываемые из текстовых файлов данные всегда передаются в код в виде строк. Потом, если, например, в строке содержатся числа, выполняют различные преобразования, чтобы эти числа получить. Для этого существуют специальные встроенные функции. В Паскале же реализовано автоматическое преобразование прочитанных данных в тип переменной, которой они присваиваются. Мы можем прочитать наш файл info.txt в том числе в численные переменные:

var
    t: text;
    data: string;
    a, b, c: integer;
begin
    assign(t, 'info.txt');
    reset(t);

    readln(t, data, a, b, c);

    close(t);

    writeln(a + b + c, ' ', data);  // 1372 Hello World!
end.

Отличие операторов read и readln при чтении из текстовых файлов состоит в том, что оператор readln, поместив значение в последнюю переменную списка параметров, переходит на начало следующей строки, не считывая оставшиеся в строке данные. С другой стороны, оператор read остается готовым считывать данные со следующей позиции текущей строки. Предположим, что в текстовом файле f имеются две строки:

1 -2
4

В этом случае два оператора read(f, m); read(f, n); поместят в целочисленные переменные m и n соответственно значений 1 и -2, а два оператора readln(f, m); readln(f, n); считают значения 1 и 4.

Подготовьте текстовый файл с числами и напишите программу, которая находит максимальное из них.

Текстовые файлы можно читать по-символьно. В программе ниже определяется, сколько в файле символов коммерческого "at" (символов "собаки"):

var
    t: text;
    ch: char;
    qty: byte;
begin
    assign(t, 'dogs.txt');
    reset(t);

    qty := 0;
    while not eof(t) do begin
        read(t, ch);
        if ch = '@' then
            qty := qty + 1; 
    end;
    writeln(qty);

    close(t);
end.

Особенностью текстовых файлов и их отличием от типизированных является то, что они являются файлами последовательного доступа: нельзя прочитать какой-либо элемент текстового файла, не прочитав все предшествующие элементы. Аналогично нельзя записывать информацию в текстовый файл произвольным образом, писать в него можно только последовательно.

Задания для дополнительной или самостоятельной работы:

Разработайте программу, которая записывает вводимы с клавиатуры данные в текстовый файл.