File (516215), страница 4
Текст из файла (страница 4)
Как и любая переменная, файл может быть передан в качестве параметра в процедуру или функцию. В этом случае необходимо использовать передачу параметра адресом ( параметр - переменная), так как создать копию файла внутри подпрограммы невозможно. Кроме того, чтобы можно было передать файл в качестве параметра, как и в случае сложных структур данных, для него необходимо предварительно описать файловый тип в разделе описания типов type.
-
Пример 2-8. Использование файловой переменной в качестве параметра.
{Программа создает файл целых чисел и печатает его содержимое. Затем файл модифицируется путем добавления в нее новых значений и снова печатает его содержимое. Для печати используется процедура печати с одним параметром -файловой переменной}
type ff=file of integer; {новый тип - файл целых чисел}
var
f1:ff; {файловая переменная типа файл целых чисел}
a,i:integer;
fname:string[10];
Procedure Prfile(var f:ff);
{процедура печати содержимого файла целых чисел
получает в качестве параметра файл целых чисел}
begin
reset(f);
writeln('содержимое файла');
i:=1;
while not eof(f) do
begin
read(f,i);
write(i:4);
end;
close(f);
writeln;
end;
Begin
writeln('введите имя файла');
readln(fname);
Assign(f1,fname);
writeln('введите ',5:3,' целых чисел:');
rewrite(f1);
for i:=1 to 5 do
begin
read(a);
write(f1,a);
end;
close(f1);
write(' начальное ');
Prfile(f1); {вызвать процедуру печати для файла f1}
reset(f1); {открыть файл для чтения}
seek(f1,filesize(f1)); {установка указателя в конец файла для дозаписи}
for i:=6 to 10 do write(f1,i); {добавление записей в файл}
close(f1); {закрытие файла после дозаписи}
Write(' после дозаписи ');
prfile(f1); {вызов процедуры печати модифицированного файла}
end.
Результат работы программы:
yyyy.dat
введите 5 целых чисел:
34 5 67 9 12
начальное содержимое файла
34 5 67 9 12
после дозаписи содержимое файла
34 5 67 9 12 6 7 8 9 10
Следует отметить, что прямой доступ позволяет находить, читать и писать любые компоненты типизированного файла. Однако, при необходимости вычеркивания из файла какой либо компоненты, такую операцию можно произвести только путем перезаписи файла в новый, без переписи туда указанных компонент.
-
Пример 2-9. Вычеркивание из типизированного файла записей.
{ Программа создает процедуру выделения из текстового файла информации о студентах в файл типа " запись" и процедуру удаления из файла записи с ошибочной группой. В основной программе вызываются соответствующие процедуры и печатаются содержимое файлов до и после обработки}
program vichzap;
uses crt;
type ss=string;
type zap=record
fam:string[10];
gr:integer;
oc1,oc2:byte;
adr:string[20];
end;
type pr=file of zap;
var
f:text; { текстовый файл исходных данных см. раздел 2.4.2}
fz,fr:pr; {файлы типа запись}
i,j:integer;
p:zap;
procedure vid(var f:text;var fz:pr);
{ процедура формирования типизированного файла записей о студентах
из текстового файла с исходными данными}
var z:zap;
begin
rewrite(fz); {открыть файл типа запись на запись}
reset(f); {открыть текстовый файл на чтение}
while not eof(f) do {пока не конец входного файла}
begin
readln(f,z.fam,z.gr,z.oc1,z.oc2,z.adr); {читать из входного файла}
write(fz,z); { писать в файл типа запись}
end;
reset(fz); {установить файл на начало}
end;
procedure vich(var f:pr);
{ процедура удаления из файла некоторых записей }
var z:zap;
f1:pr;
begin
assign(f1,'fr.dat');
reset(f); {открыть файл на чтение}
rewrite(f1); {открыть временный файл на запись}
while not eof(f) do {пока не конец файла}
begin
read(f,z); {читать из основного файла }
if z.gr<>1 then {если номер группы не равен 1}
write(f1,z); {писать во временный}
end;
close(f); {закрыть основной файл}
close(f1); {закрыть временный файл}
erase(f); {удаление основного файла}
rename(f1,'fz.dat'); {переименование временного файла}
assign(f,'fz.dat'); {переназначить временный файл, как основной}
reset(f) {открыть основной файл на чтение}
end;
{ основная программа}
begin
clrscr;
assign(f,'f.dat'); {назначить файл для входных данных }
assign(fz,'fz.dat'); { назначить файл для хранения записей о студентах}
vid(f,fz); {вызвать процедуру формирования файла записей}
writeln(' данные, считанные из файла входного файла'); writeln;
while not eof(fz) do { пока не конец файла записей}
begin
read(fz,p); {читать запись из файла}
writeln(p.fam:10,p.gr:3,p.oc1:3,p.oc2:3,p.adr); {печатать запись}
end;
writeln;
writeln(' результат вычеркивания ');
writeln;
vich(fz); { вызвать процедуру вычеркивания из файла записей}
while not eof(fz)do { пока не конец файла}
begin
read(fz,p); { читать запись}
writeln(p.fam:10,p.gr:3,p.oc1:3,p.oc2:3,p.adr); { печатать запись}
end;
close(fz); { закрыть файл записей}
close(f); { закрыть файл исходных данных}
end.
Результат работы программы
данные, считанные из файла входного файла
иванов 12 5 4 молодежная д.5 кв.3
петров 12 4 4 юбилейный д.45 кв.4
сидоров 1 3 4 калинина д.85 кв.33
васин 12 5 4 комсомольскаяя д.32
мамин 1 5 5 молодежная д.1 кв.6
рязанов 12 5 3 молодежная д.6 кв.2
результат вычеркивания
иванов 12 5 4 молодежная д.5 кв.3
петров 12 4 4 юбилейный д.45 кв.4
васин 12 5 4 комсомольскаяя д.32
рязанов 12 5 3 молодежная д.6 кв.2
2.4.2.Текстовые файлы.
Текстовый файл - это файл, элементами которого являются символьные строки переменной длины, заканчивающиеся признаками конца строки ( EOLN ). В конце всего файла - признак конца файла (EOF). Эти признаки можно протестировать одноименными логическими функциями, но можно воспользоваться следующими системными соглашениями:
EOLN - это последовательность кодов ASCII 13 (CR - конец строки, вводится при нажатии клавиши «ENTER») и 10 (LF - перевод каретки)
EOF - это код ASCII 26 (CTRL - Z))
Так как компоненты текстового файла могут иметь различную длину, возможна только последовательная их обработка (последовательный доступ).
Текстовые файла предназначены для хранения текстовой информации: символов, строк, символьные массивы, а также логические и числовые данные, которые при этом преобразуются к символьному виду. Поэтому, иногда текстовые файлы называют файлами с преобразованием. Объявление текстового файла осуществляется с помощью стандартного идентификатора TEXT двумя способами:
1. предварительно ввести новый тип - файл переменных типа TEXT, а затем определить файловую переменную этого типа, например
TYPE <имя типа> = TEXT;
VAR <файловая переменная >: <имя типа>;
2. сразу определить файловую переменную как файл типа TEXT, например
VAR <файловая переменная >: TEXT;
Текстовый файл можно открыть на запись, чтение и добавление. Файл, открытый на запись не может использоваться для чтения и наоборот. При открытии файла на добавление, система проверяет не был ли файл открыт на чтение или запись, и если такой факт имел место - производится сначала его открытие, а затем уже открытие на добавление.
Процедура работы с текстовыми файлами.
-
Функция EOLN(<файловая переменная>) - логического типа, возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки; при отсутствии файловой переменной проверяется стандартный файл INPUT;
Имеется ряд отличий в работе функций EOLN и EOF с дисковыми файлами и логическими устройствами. Для логического устройства невозможно предвидеть, каким будет результат чтения очередного символа. Поэтому при работе с логическим устройством функция EOLN возвращает TRUE, если последним считанным символом был CR CTRL-L. при работе с диском функция EOLN возвращает TRUE, если последним считанным символом будет CR CTRL-L
Аналогичное различие наблюдается и в функции EOF: для логического устройства TRUE возвращается в случае, если последним символом был CTRL-L, а при чтении с диска - если следующим считываемым символом будет CTRL-L.
-
Процедура READ(<файловая переменная>,<список ввода>) обеспечивает ввод символов, строк и чисел.
<список ввода> - последовательность из одной или более переменных типа CHAR, STRING, а также любого целого и вещественного типа. При обработке переменных типа CHAR выполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR (ASCII код 13 ), а если достигнут конец файла, то символ EOF ( ASCII код 26 ).
При вводе переменных типа STRING количество считанных процедурой и перемещенных в строку символов равно максимальной длине строки, если раньше не встретились символы CR или EOF, которые в строку не переносятся. Символы, выходящие за размер максимальной длины строки - отбрасываются. Новое обращение к процедуре READ вернет пустую строку. Следовательно, READ не в состоянии читать последовательность строк, так как первая строка будет прочитана правильно, а все последующие окажутся пустыми.
При вводе числовых данных READ пропускает все пробелы, знаки табуляции и маркеры до первого до первого значащего символа и читает строку до пробела, знака табуляции и маркера. Полученная подстрока преобразуется из символьного вида во внутреннее представление в соответствии с типом числа и присваивается переменной из списка. Если нарушен формат - возникает ошибка ввода-вывода. если прочитан конец файла - переменной присваивается 0.
Ввод логических констант процедурами READ и READLN не предусмотрен.
Чтение осуществляется через буфер, который передается процедуре при нажатии клавиши ENTER и равен 127 байт.
-
Процедура READLN(<файловая переменная>,<список ввода>) обеспечивает ввод символов, строк и чисел. Идентична процедуре READ, за исключением того, что после чтения последней переменной оставшаяся часть строки до маркера EOLN пропускается , так что следующее обращение к READLN или READ начнется с первого символа новой строки.
Эта процедура может быть вызвана без параметра. <список ввода>, что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Процедуры READ и READLN могут использоваться без параметра <файловая переменная>. В этом случае операция чтения осуществляется из стандартного файла INPUT, причем, использование процедуры READLN без параметров после процедуры READ приведет к простому переходу на новую строку файла INPUT. Применение этой же процедуры без предшествующей ей процедуры READ вызывает переход в состояние ввода и выполнение программы приостанавливается до нажатия клавиши ENTER. Может использоваться как пауза для просмотра содержимого экрана.
-
Процедура WRITE(<файловая переменная >,< список вывода >) - обеспечивает вывод информации в текстовый файл или передачу ее на логическое устройство.
< список вывода > - последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также любого целого или вещественного типа.