Типизированные и нетипизированные файлы в Паскале

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

Файл, определенный стандартным или пользовательским типом данных, называется типизированным. Общая форма объявления типизированных файлов имеет вид:

Var <имя файла>: File of <тип компонент>;

Здесь тип компонент может быть любым типом данных, определенных в Pascal, но только не файловым. Для работы с типизированными файлами используются уже знакомые нам процедуры и функции: Write, Read, Seek, Filesize, Filepos, а также процедура Truncate:

Truncate(<имя файловой переменной>)

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

Одной из главных особенностей типизированного файла является возможность прямого обращения к его отдельным компонентам. Это достигается за счет, того что заранее известен тип компонент файла. Рассмотрим два примера кода, в первом из которых обращение к элементам файла происходит последовательно, а во втором прямо.

Пример 1.

Вычислить среднее арифметическое элементов файла.

Решение:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
program type_fail;
uses crt;
var
f: file of integer; {объявление файловой переменной}
x, n, i: integer;
sr: real;
begin
assign (f, ‘file.dat’); {создание файла}
rewrite(f); {открытие файла в режиме записи}
write(‘Количество элементов ‘); read(n);
for i:=1 to n do
begin
readln(x); {ввод элемента}
write(f, x); {запись элемента в файл}
end;
clrscr; n:=0;
reset(f); {открытие файла в режиме чтения}
while not eof(f) do {выполнять пока не достигнут конец файла}
begin
read(f, x);
n:=n+x;
end;
sr:=n/filesize(f);
close(f); {закрытие файла}
write(‘Среднее арифметическое = ‘, sr);
end.

Пример 2.

Поменять строки в файле местами.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
program type_fail;
uses crt;
var
f: file of string;
i: integer;
s, s1, s2, s3: string;
begin
assign (f, ‘file.dat’);
s1:=‘Pascal’;
s2:=‘ на ‘;
s3:=‘Программирование’;
rewrite(f);
write(f, s1, s2, s3); {запись строк в файл}
reset(f);
write(‘Выводим как есть: ‘);
while not eof(f) do {вывод содержимого файла}
begin
read(f, s);
write(s);
end;
writeln;
write(‘Вывод после обработки: ‘);
for i:=2 downto 0 do
begin
seek(f, i); {смена позиции указателя}
read(f, s);
write(s);
end;
close(f);
end.

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

Бестиповые (нетипизированные) файлы

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

Общая форма записи нетипизированных файлов

Var <идентификатор>: File;

отличается от типизированных отсутствием части of <тип данных>. Кроме того, немного изменяется принцип действия процедур Reset и Rewrite. К ним прибавляется второй параметр типа Word:

reset(<имя файловой переменной>, <значение>)

rewrite(<имя файловой переменной>, <значение>)

Здесь «значение» — это новый размер буфера, который по умолчанию равен 128 байтам. В качестве минимального значения можно указать 1 байт, а максимального — 64 кбайт (число в байтах).

Также в бестиповых файлах для записи и чтения информации используются не стандартные процедуры Read и Write, а две новые: BlokRead и BlockWrite. Рассмотрим каждую из них.

Процедура BlockRead

Данная процедура считывает из файла заданное число записей, которые помещаются в память.

Общая форма записи:

BlockRead(<имя файловой переменной>, <x>, <количество байт>, <y>);

x, y – обычные переменные, в первую помещается прочитанные данные, во вторую – количество считанных байт. В случае удачи y (y – необязательный параметр) будет иметь тоже значение, что и третий параметр.

Процедура BlockWrite

Для записи информации в бестиповый файл предназначена процедура BlockWrite:

BlockWrite(<имя файловой переменной>, <x>, <количество байт>, <y>);

Параметры процедуры BlockWrite точно такие же, как и у BlockRead. Да и принцип их одинаков, за исключением того, что первая записывает данные в файл, а вторая считывает их из него.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
program no_type_fail;
uses crt;
var
f: file;
x, i ,n: byte;
begin
clrscr;
assign(f, ‘f’);
rewrite(f, 1);
write(‘n = ‘); readln(n);
for i:=1 to n do
begin
x:=ni;
blockwrite(f, x, 1); {запись в файл}
end;
reset(f, 1);
while not eof(f) do
begin
blockread(f, x, 1); {чтение из файла}
write(x,‘ ‘);
end;
close(f);
readkey;
end.

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

Рейтинг
( Пока оценок нет )
Загрузка ...