Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на языке Паскаль в среде Turbo Pascal версии 6 и 7 (Курс лекций). Воронов Г.И.Санкт-Петербург 2010г.doc
Скачиваний:
90
Добавлен:
15.04.2015
Размер:
754.69 Кб
Скачать

Файлы без типов

В Турбо Паскале предусмотрена возможность работать с файлом, у которого не описано строение записи, а определен только размер. По умолчанию размер записи равен 128 байтам, но его можно задать любым значением от 1 до 32767 при открытии файла. Чтение или запись таких файлов выполняется по одной или несколько записей. Для данных в оперативной памяти обычно выделяется место - буфер. Буфер не может быть больше 64 Кбайт, и за одну операцию ввода или вывода нельзя передать данных больше чем размер буфера.

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

Для работы с файлом в режиме прямого доступа используется процедура Seek, для удаления части файла - Truncate. Поиск и фиксация положения в файле выполняется в записях. Чаще всего длина записи принимается равной 1 байту, а ввод/вывод выполняется по такому количеству байт, которое необходимо для ввода или вывода нужного объекта данных. Для этого часто используют стандартную функцию SizeOf.

Процедуры, используемые при работе с нетипизированными файлами

BlockRead(F, Buf, N, Nfact) - чтение из файла. Считывается N записей, начиная с текущего места в файле в область памяти, занимаемую переменной Buf. Количество прочитанных байтов равно произведению N на длину записи, указанную в процедуре открытия файла или меньше, если при чтении достигается конец файла. Программа не проверяет, помещается ли считанная информация в область памяти, отведенную переменной Buf. Если при обращении к процедуре используется необязательный параметр Nfact, то в него заносится фактически прочитанное число записей. При этом не возникает ошибки, если достигается конец файла вовремя ввода. По окончании процедуры, указатель файла перемещается на соответствующее число записей вперед.

BlockWrite(F, Buf, N, Nfakt) - запись в файл. Записывается N записей (или меньше, если на диске кончится место) по Size байт каждый (Size задается в процедуре открытия файла). Все записываемые байты данных выбираются начиная с первого байта области, занятой переменной Buf. Необязательный параметр Nfakt становится равным фактическому количеству сделанных записей. По окончании процедуры, указатель файла перемещается на соответствующее число записей вперед.

Функции, используемые при работе с нетипизированными файлами.

Возможно использование функций FilePos(F) и FileSizs(F), так же как и для типизированных файлов.

Примеры полной программы работы с нетипизированными файлами можно найти в описаниях Турбо Паскаля 6 и 7 версий, здесь рассмотрим отдельные операторы работы с такими файлами. Например, если нужно записать в файл строку Head из 20 символов, затем значение вещественной переменной Х, занимающей в памяти 6 байт и целочисленный массив Matrix типа mass2, это можно сделать следующими операторами:

. . .

TYPE

mass2 = array[1..20,5..14] of integer;

. . .

VAR

Foutput : File;

Head : string[20];

Matrix : mass2;

X : real;

Number : integer;

. . .

BEGIN

. . .

Assign(Foutput,'SVALKA.DAN');

Rewrite(Foutput, 1);

. . .

BlockWrite(Foutput,Head,SizeOf(Head));

BlockWrite(Foutput,X,6);

BlockWrite(Foutput,Matrix,SizeOf(mass2),Number);

if Number <> SizeOf(mass2) then

Writeln(' Не хватает места на диске!');

. . .