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

Текстовый файл представляет собой последовательность символов, сгруппированные в строки. Каждая строка завершается маркером конца строки. В операционной системе Windows такой маркер представляет собой два символа: символ перевода строки chr(13) и символ возврата каретки chr(10). Для операционной системы Linux маркером конца строки является один символ.

Текстовые файлы есть файлы с последовательным доступом, где доступ к некоторому элементу возможен только после прочтения всех предыдущих элементов. Именно поэтому для текстовых файлов не определена функция seek.

У текстовых файлов своя специфика. Процедуры read и write при работе с текстовыми файлами обеспечивают преобразование вводимых символов к типу той переменной, которая указывается в файловых операциях.
Так, процедура read(файловая переменная, переменная) осуществляет ввод последовательности цифр, которая затем интерпретируется в число, значение которого будет присвоено переменной. Если в последовательности цифр встречается нецифровой символ, то возникает ошибка выполнения программы. При вводе/выводе строк никакого дополнительного преобразования не происходит и строки обрабатываются как есть.

Файловая переменная описывается с помощью типа text.
var f:text;

Перед использованием файловой переменной должна быть установлена связь с внешним файлом с помощью процедуры assign.
assign(f, ‘work.txt’)

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

Следует иметь ввиду, что текстовые файлы можно открыть либо на запись, либо на чтение. На чтение можно открыть только реально существующий файл. Выполняется это с помощью процедуры reset.
reset(f)

Новый файл создается и открывается на запись с помощью процедуры rewrite.
rewrite(f)

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

Обратите внимание, что операции чтения из файла отличается от ввода с клавиатуры только наличием имени файла в качестве первого операнда процедуры read. И это справедливо, поскольку в операционной системе устройства ввода-вывода являются файлами. Для операционной системы такие файлы имеют стандартные имена. Отсутствие имени файловой переменной в процедуре read означает ввод из файла по умолчанию (с клавиатуры), а отсутствие файловой переменной в процедуре write означает вывод в файл с именем по умолчанию (на экран монитора).

Замечательно, что в момент начала выполнения программы автоматически открываются стандартные текстовые файловые переменные input и output. Input – файл, связанный с клавиатурой, output – файл, связанный с дисплеем. Если не указывается имя файловой переменной, то считается, что чтение происходит из файла со стандартным именем input, а вывод – в файл со стандартным именем output.

Пример ввода целого числа с клавиатуры и вывода его на экран.
var n:integer;
begin
write(‘введи число’);
read(n);
write(n);
end.

Пример ввода целого числа из файла input.txt и вывода его в файл output.txt.
var n:integer;
f, g: text:
begin
assign(f,’input.txt’);
reset(f);
read(f, n);
assign(g,’output.txt’);
rewrite(g);
write(n);
close(f);
close(g);
end.

Пример ввода целого числа из файла input.txt и вывода его в файл output.txt.
var n:integer;
begin
assign(input,’input.txt’);
reset(input);
read(n);
assign(output,’output.txt’);
rewrite(output);
write(n);
close(input);
close(output);
end.

Сравним две последние реализации. Вместо файлов f и g используются стандартные имена input и output.

Стандартный поток ввода input перенаправлен в файл input.txt. В результате ввод будет осуществляться из файла с именем input.txt. Аналогично, стандартный поток вывода output перенаправлен в файл с именем output.txt, обеспечив таким образом вывод в текстовый файл с именем output.txt.

Для работы с текстовым файлом определены процедуры следующие процедуры и функции:
read – считывает одно или более значений из файла в переменные из списка
readln – выполняет те же действия, что и процедура read, а затем делает пропуск данных до начала следующей строки файла
write – записывает в файл одно или более значений
writeln – выполняет  те же действия, что и процедура write, а затем добавляет маркер конца строки.

При работе с текстовыми файлами используются следующие функции.
append(имя файловой переменной) – процедура, которая открывает существующий файл для дописывания;
eof(имя файловой переменной) – логическая функция, которая проверяет достигнут ли конец файла
eoln(имя файловой переменой) – логическая функция, которая проверяет, достигнут ли конец строки
seekof – логическая функция, которая проверяет достигнут ли конец файла, пропуская при этом разделители (пробелы, символы табуляции и конца строки)
seekeoln – логическая функция, которая проверяет достигнут ли конец строки, пропуская при этом пробелы и символы табуляции.

 

Приведем некоторые примеры, показывающие особенности использования приведенных процедур.
Пример 1. Подсчитать среднее арифметическое целых чисел, расположенных в строках файла. Количество чисел в строке и количество строк при этом неизвестно.
var n,kol: integer;
s: real;
begin
assign(input, ‘input.txt’);
reset(input);
assign(output,’output.txt’);
rewrite(output);

while not seekeof do
begin
kol:=0;
s:=0;
while not seekeoln do
begin
read(n);
s:=s+n;
kol:=kol+1;
end;
if kol>0 then writeln(s/kol:0:3)
readln;
end;
close(input);
close(output);
end.

Обратим внимание, что место функций eof и eoln использовались функции seekeof и seekeoln. При таком способе не возникает ошибок, связанных с наличием пробелов в конце строки или пустых строк в конце файла. Функции eof и eoln корректно работают только в случае, если маркер конца строки стоит непосредственно после последнего числа в файле. То же требование относится к признаку конца строки при использовании функции eoln. Поэтому в случае реализации через функцию, например, eoln при наличии пробелов в конце строки признак конца строки не был бы найден.

Если необходимо по условию задачи считывать строку как текст, то, разумеется, использование функций seekoeof и sekeoln было бы неоправданным, поскольку для строки символ пробел является значимым. Поэтому если длина строки по условию задачи ограничена определенным количеством символов (например, 255), то удобнее всего производить считывание с использованием переменной строкового типа string:
while not eof(f) do
begin
readln(f,s);
if s<>’’ then <обработать строку>
end;

Если ограничений на длину строки нет, то считывание лучше производить посимвольно.
while not eof(f) do
begin
while not eoln(f) do
begin
read(f, ch);
<обработка символа>
end;
readln(f);
end;

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

while eof do
begin
read(ch);
while ch<>’ ‘ do
begin
s:=s + ch;
read(ch);
end;
read(kol);
for i:=1 to kol do
begin
read(num);
sum:=sum+num;
end;
sr:=sum/kol;
< обработка >
end;

Адрес: 614039, г. Пермь, ул. Комсомольский проспект, 45
Телефон: +7 (342) 212-80-71
E-Mail: school9-perm@ya.ru
Вопрос администратору сайта