Главная » Free Pascal » Работа с типизированными файлами Free Pascal

0

Напомним, что типизированный файл состоит из порций данных, тип которых был объявлен при описании соответствующей файловой переменной. В качестве такой порции могут выступать значения скалярных переменных любого типа, строки, содержимое полей записи. Это означает, что все переменные списка ввода в операторе read и все выражения в списке оператора write должны быть такого же типа.

В чем принципиальное отличие между обменом данными с текстовым и типи- зированным файлом?

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

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

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

Следует обратить внимание еще на одно преимущество типизированных фай-

лов по сравнению с текстовыми файлами. Так как все записи в типизированном файле равной длины, то имеется возможность вести не только последовательный обмен, но и выбирать нужную запись. Записи в таком файле нумеруются с 0. После открытия файла становится доступной начальная запись. Для перемещения в нача- ло записи с номером n_REC используется процедура seek:

seek(vf, n_REC);

Функция FilePos позволяет определить номер текущей доступной записи:

pos:=filepos(vf);

С помощью функции FileSize можно узнать количество записей в файле:

k:=filesize(vf);

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

   Листинг 1 0 .4 .  Программа  rec_file                                            

program rec_file; type

qq=record

s: string[5]; b: byte;

d: double; end;

var

f: file of qq; j: byte;

rec: qq; begin

assign(f,’5.dat’); rewrite(f); rec.s:=’Line ‘; for j:=1 to 10 do

begin

rec.b:=j; rec.d:=sqrt(j);

write(f,rec); writeln(rec.s,rec.b:4,rec.d:10:4);

end;

close(f); writeln; reset(f);

for j:=9 downto 0 do begin

seek(f,j);

read(f,rec); writeln(rec.s,rec.b:4,rec.d:10:4);

end;

readln; end.

На экране результаты обмена с файлом 5.dat выглядят следующим образом:

Running "c:\fpc\myprog\rec_file.exe "

Line 1 1.0000

Line 2 1.4142

Line 3 1.7321

Line 4 2.0000

Line 5 2.2361

Line 6 2.4495

Line 7 2.6458

Line 8 2.8284

Line 9 3.0000

Line 10 3.1623

Line 10 3.1623

Line 9 3.0000

Line 8 2.8284

Line 7 2.6458

Line 6 2.4495

Line 5 2.2361

Line 4 2.0000

Line 3 1.7321

Line 2 1.4142

Line 1 1.0000

Файл прямого доступа, открытый для чтения, позволяет в процессе обработки производить не только операции чтения, но и записи. Приведенный в листинге 10.5 пример любопытен еще и тем, что содержимое одного и того же файла можно рас- сматривать и как набор строк, и как типизированный файл с однобайтовыми запи- сями. В программе txt_rec сначала формируется содержимое текстового файла, содержащего случайное количество строк (k — количество строк). Каждая строка содержит случайный набор отображаемых символов из первой половины таблицы

ASCII (с кодами от 32 до 127). Число символов в строке от 1 до 40 (j — длина строки). Каждая строка, записываемая в файл, дублируется на экране. Затем тек- стовый файл закрывается и открывается повторно, но уже как файл прямого досту- па. Очередной символ, считываемый из файла, подвергается преобразованию с по- мощью функции LowerCase. При этом все символы, не принадлежащие интервалу [A..Z], в том числе и управляющие байты, завершающие каждую строку, сохраня- ются без изменения (для экономии их можно было бы не подвергать преобразова- нию). Модифицированный таким образом символ записывается в файл, открытый для чтения. После завершения перекодировки модифицированный файл вновь от- крывается как текстовый и его содержимое выводится на экран для сопоставления с исходным набором данных.

   Листинг 1 0 .5 .  Программа  txt_rec                                             

program txt_rec; var

ft: text;

fc: file of char; s: string;

ch: char; i,j,k: integer;

begin

randomize; assign(ft,’1.txt’); rewrite(ft); k:=random(10)+1;

// Создаем текстовый файл со случайным набором символов for i:=1 to k do

begin

s:=”;

for j:=1 to random(40)+1 do

s:=s+chr(random(95)+32); // формирование случайной строки writeln(ft,s);   // запись исходной строки в файл writeln(s);      // вывод исходной строки на экран

end; close(ft);

writeln;  // пробел между исходным

// и модифицированным набором данных assign(fc,’1.txt’);

reset(fc); // открываем файл для чтения как типизированный while not EOF(fc) do

begin

read(fc,ch);            // читаем из файла очередной символ ch:=LowerCase(ch);      // заменяем большую букву малой seek(fc,FilePos(fc)-1); // возвращаемся на одну запись write(fc,ch);           // записываем ее в файл

end; close(fc);

// Выводим на экран содержимое перекодированного файла

assign(ft,’1.txt’); reset(ft);

for i:=1 to k do begin

readln(ft,s); writeln(s);

end; close(ft); readln;

end.

Результат одного из тестовых запусков выглядит следующим образом:

Running "c:\fp_prog\10\05\txt_rec.exe " Wq!M5>oeT{s?4\z%{= 8iEDB=0r&gwA4~ZY>sC%jB/Jk1:dvGa_gn:m]KR (R^]MJB%lKu[3

Xd6l1Qa2O6L+?sh~%Ry.6nlR2Mr-Z`Y#\7K_m\ QtqU`!>SM1:h6xm’?;ELu}>Q8|n]U9Iq#puwj@ HBjm~Dxm

1IB[%{mc7*dZ[( XKp{ kZ wq!m5>oet{s?4\z%{= 8iedb=0r&gwa4~zy>sc%jb/jk1:dvga_gn:m]kr (r^]mjb%lku[3 xd6l1qa2o6l+?sh~%ry.6nlr2mr-z`y#\7k_m\ qtqu`!>sm1:h6xm’?;elu}>q8|n]u9iq#puwj@ hbjm~dxm

1ib[%{mc7*dz[( xkp{ kz

Источник: Кетков, Ю. Л., Свободное программное обеспечение. FREE PASCAL для студентов и школьников, Ю. Л. Кетков, А. Ю. Кетков. — СПб.: БХВ-Петербург, 2011. — 384 с.: ил. + CD-ROM — (ИиИКТ)

По теме:

  • Комментарии