Типизированные файлы
Файл, определенный стандартным или пользовательским типом данных, называется типизированным. Общая форма объявления типизированных файлов имеет вид:
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:=n—i; 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. |
Возможно, что ваша среда программирования не поддерживает работу с файлами, не имеющими типа. Поэтому прежде чем начать искать ошибку в коде, стоит узнать про данную функцию.