Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Сборник заданий по T-Pascal.doc
Скачиваний:
64
Добавлен:
18.03.2015
Размер:
3.03 Mб
Скачать

7.3 Типизированные файлы

Описание типизированного файла имеет вид

van ftable: file of type_ID;

где type_ID может быть любым типом за исключением файлового. Элементами типизированного файла являются значения указанного типа. При работе с типизированными файлами можно использовать уже знакомые нам процедуры Assign, Reset и Rewrite. Следует заметить, что текстовый файл, открытый процедурой Reset, доступен только для чтения, а типизированный — еще и для записи. Процедуры Read и Write здесь используются по-другому. Отличие заключается в там, что каждый из параметров в рассматриваемом случае должен быть переменной типа type ID, а выражения и константы недопустимы. Процедуры ReadLn и WriteLn применяются только к текстовым файлам. Типизированные файлы используются для хранения однородной (по типу) информации. Если речь идет о хранении числовых данных, следует использовать типизированные файлы. Почему? Рассмотрим программу, которая производит запись числовых данных в текстовый и типизированный файлы.

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

program file_of_extended;

var

extfile: file of extended: textfile: text; x, y: extended: i: word;

begin

assign(textfile, 'table.txt');

rewrite(textfile);

x := 0.0;

for i := 1 to 1000 do

begin

у := sin(x); WriteLn ( textfile, y);

x := x + 0.001; end;

close(textfile);

assign(extfile. 'table.ext');

rewrite(extfile);

x := 0.0;

for i := 1 to 1000 do

begin

у := sin(x);

write(extfile, y);

x := x + 0.001: end;

close(extfile);

Write('Работа программы закончена, нажмите <Enter>:');

ReadLn;

end.

После выполнения этой программы на диске (в рабочем каталоге программы) появятся два файла, table.txt и table.ext. Первый из них является текстовым файлом, второй — типизированным. Несмотря на то, что эти файлы содержат одинаковую информацию, между ними имеется существенное различие. Если просмотреть содержимое обоих файлов, то в первом случае (текстовый файл) мы увидим столбик цифр. Во втором случае (типизированный файл) на экране отобразится хаотический набор символов. Если мы сравним, кроме того, размер обоих файлов, то обнаружим, что файл table.ext имеет длину 10 000 байт, а файл table.txt — 25 000 байт. Почему? Переменная типа Extended занимает 10 байт, поэтому типизированный файл, содержащий 1000 чисел типа Extended, имеет размер 10 000 байт. Но если переменная типа Extended хранится в виде текстовой строки, то эта строка состоит из 23 символов, так как она включает показатель степени «E+nnnn» или «Е—nnnns». Добавьте сюда еще управляющие символы CR и LF, которыми оканчивается каждая строка при вызове процедуры WriteLn, и вы получите 25 символов на каждое значение типа Extended, записанное в текстовый файл. В итоге это даст 25 000 байт. По этой причине для хранения числовых данных экономнее использовать тип file of Extended.

7.4 Нетипизированные файлы

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

var untypfile: file:

Такая файловая переменная связывается с внешним файлом обычным образом. В числе параметров процедур Reset и Rewrite для нетипизированных файлов кроме файловой переменной имеется необязательный второй параметр типа Word:

Reset(untypfile. n); Rewhte(untypfile, n);

Дополнительный параметр n описывает размер индивидуальной записи в файле (в байтах). Если параметр n отсутствует, его значение по умолчанию принимается равным 128, однако рекомендуется явно указывать значение 1. Это связано с тем, что при любом другом значении величины записи в файле могут присутствовать неполные записи, а это не всегда удобно.

Теоретического багажа и практических навыков программирования на Паскале у нас уже достаточно для того, чтобы приступить к программе, имеющей достаточно большое практическое значение. Проблема состоит в том, чтобы прочитать текстовый файл, созданный в операционной системе UNIX, и записать его в формате текстового файла операционной системы MS-DOS. Можно представить себе ситуацию, когда некий файл был создан на сервере, работающем под управлением UNIX, а затем скопирован на компьютер пользователя, работающий под управлением MS-DOS. He исключено также, что вы получали такой файл в UU-кодированном виде по электронной почте. Разница между форматами хранения текстовых файлов в упомянутых операционных системах состоит в том, что в UNIX каждая строка текстового файла оканчивается одним управляющим символом LF, а в DOS каждая строка оканчивается двумя последовательными управляющими символами CR и LF. Таким образом, входной файл имеет формат, отличный от текстового формата Паскаля.

Программа преобразования текстовых файлов из формата UNIX в формат DOS

program Unix2Dos:

const

LF =#10; CR = #13;

var

word:

unix_file, dos_file: file;

buffer: array[1..4] of char: input_bytes, output_bytes, i: word;

begin

assign(unix_file, paramstr(1);

reset (unix_file. 1); assign(dos_file. paramstr(2));

rewrite(dos_file. 1);

WriteLn(Выполняется преобразование файла Unix', paramstr(1), в файл DOS ', paramstr(2));

repeat

blockread(unix_file. buffer, SizeOf(buffer)-2, input_bytes);

for i := input_bytes downto 1 do

begin

if buffer[i] = LF then begin

inc(input_bytes);

move(buffer[i]. buffier[i + 1]. input_bytes - i);

buffer[i] := CR;

end;

end;

blockwrite(dos_file, Buffe, input_bytes, output_bytes);

until (input_bytes =0) or (output_bytes <> input_bytes);

close(dos_file); close(unix_file):

end.

Итак, задача заключается в том, чтобы считать файл UNIX и заменить в нем каждый символ LF на пару символов CR и LF, не изменяя все остальные символы. Программа вызывается в командной строке с двумя параметрами, которыми являются имена входного и выходного файлов:

unix2dos fileunix filedos

Вначале открываются два файла — входной и тот, в который будет производиться запись. Затем производится считывание «порции» данных из входного файла. Процедурами для чтения нетипизированных файлов и для записи в них являются BlockRead и BlockWrite. Программа выделяет в качестве буфера область памяти, куда будет производиться запись и откуда будет производиться чтение. Роль буфера играет символьный массив buffer, размер которого 4 байта. В силу того что мы будем добавлять символы CR, размер буфера должен быть больше, чем число считанных байт. В переменной input_bytes содержится количество фактически считанных байт. Это значение будет равно 2 до тех пор, пока процедура BlockRead не будет вызвана последний раз. Замечу, что BlockRead имеет четыре параметра — файловую переменную, переменную буфера, количество байт, которые следует считать, и количество байт, считанных в действительности. Обращение к BlockWrite имеет аналогичный вид. Функция paramstr(i) возвращает значение i-гo параметра командной строки.