Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгор_ТХТК_пособие.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.6 Mб
Скачать

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

Типизированный или компонентный файл – это файл с объявленным типом его компонентов, т.е. файл с наборами данных одной и той же структуры. Объявление такого файлового типа имеет вид:

Var

Имя : File Of Тип_Записей;

где Тип_Записей – скалярный (число, символ) или сложный (массив, тип Record и др.).

Пример. Type

Anketa = Record

Fam,Im,Ot : String[10];

Numz : Integer;

O : Array[1..5] Of Integer;

End;

Var

FilAnk : file of Anketa;

Dan : File Of Real;

Fl : File Of Char;

Rank : Anketa;

X : Real;

Процедуры обработки типизированных файлов

Read (f,<сп. ввода>) – считывает данные из файла. Здесь <сп. ввода> - список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла.

Write (f,<сп. ввода>) – записывает данные в файл.

Seek (f,<№ компоненты>) – устанавливает номер текущего компонента файла f. Назначенный компонент будет считан или записан последующей операцией ввода-вывода. Процедура организует прямой доступ в файл.

Функции обработки типизированных файлов

Eof (f) – возвращает результат типа Boolean: True, если считан последний компонент файла, и False – в противном случае. Файл должен быть открыт.

FilePos (f) – возвращает номер текущего компонента. Результат типа Longint.

Filesize (f) – возвращает реальное число записей в открытом файле. Результат типа Longint.

Пример 8.3 Программа обработки файла, содержащего данные простого типа. При исследовании некоторого технического объекта замерены его параметры Xi и записаны в набор данных StatDan в виде вещественных чисел. Вычислить их среднее значение Mx и стандартное отклонение  по формулам:

Program Stat;

Var

F : File Of Real;

X,m,s : Real;

N : Integer;

Begin

Assign(F,’StatDan’);{ Здесь имя набора задано в виде}

Reset(F); { строковой константы StatDan}

S := 0;

M := 0;

N := 0;

While not Eof(F) do

Begin

Read(F,X);

N := N+1;

M := M+x;

S := S+Sqr(X);

end;

M := M/N;

S := Sqrt(S-Sqr(M))/ N;

Writeln(’Количество измерений - ’,N);

Writeln(’Среднее: ’,M:8:3,’ Отклонение: ’,S:8:3);

end.

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

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

f: File;

Принципы работы с нетипизированными файлами такие же, как и с типизированными. Нетипизированные файлы являются файлами прямого■ доступа. Файловая переменная должна быть связана с конкретным физическим файлом оператором Assign. Далее файл должен быть открыт для чтения или записи с помощью процедуры Reset(f) или Rewrite(f). В конце работы файл должен быть закрыт процедурой Close(f).

По умолчанию размер буфера передачи данных равен 128 байт. Можно явным способом указать иной размер буфера (чем он больше, тем быстрее происходит ввод-вывод), исходя из ресурсов памяти и удобства работы с данными. Для задания буфера надо после оператора Assign открывать файл расширенной записью процедур:

Reset (f, BufSize) и Rewrite (f, BufSize),

где f - переменная типа File; BufSize типа Word - задает число байтов, считываемых (или записываемых) из файла за одно обращение к нему.

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

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

BlockRead (Var f : file; Var A; n : Word; Var result: Word) и BlockWrite (Var f : file; Var A; n : Word; Var result : Word).

Эти процедуры осуществляют чтение в переменную А и запись из переменной А не компонентов файла или его строк, а блоков, состоящих из того количества байтов, которое определено для буфера файла f. Если n больше 1, то за одно обращение будет считано п емкостей буфера. Значение n < 1 не имеет смысла. Всегда должно выполняться условие:

n * BtrfSize < 64K.

Необязательный параметр result возвращает число буферов, считанное текущей операцией BlockRead. Аналогичный параметр в процедуре BlockWrite после каждой операции записи показывает число буферов, записанное этой операцией. Если операции ввода или чтения прошли успешно, то значения result будут равны соответствующим значениям п. Эти параметры могут использоваться для контроля выполнения BlockRead и BlockWrite.

Пример 8.4 Скопировать содержимое файла а1 в файл а2. Использовать нетипизированные файлы.

Размер блока нетипизированного файла в операторах Reset и Rewrite зададим равным 1. Количество записей, которые должны быть прочитаны или записаны за одно обращение к диску, в этом случае рассчитывается просто это размер памяти, необходимой для переменной в операторе BlockRead. Если Buf массив из 10000 элементов типа Char, то количество записей, считанных за одно обращение, равно 10000. Окончание считывания определяется по последнему параметру процедуры BlockRead. При последнем вводе количество фактически обработанных записей либо равно 0, либо меньше n.;

Program Task8;

Const nn = 10000;

Var

alFile, a2File : String[20];

Buf : Array[1 ..nn] of Char; {Массив из 10000 символов.}

f, f1 : File;

code : byte;

n, n1 : Word;

Begin

Repeat

Write ('Введите имя исходного файла');

Readln (a 1 File);

Assign (f, alFile);

{$1-} Reset (f,1); {$l+}

code := IOResult;

If Code <> 0 Then

WritelnC Ошибка чтения файла!')

Until Code = 0;

Write('BBeflHTe имя выходного файла');

Readln(a2File);

Assign (f 1, a2File);

Rewrite (f1, 1);

Repeat

BlockRead(f, Buf, Sizeof(Buf), n);

BlockWrite(f 1, Buf, n, n1);

Until (n = 0) or (noni);

Close (f1);

Close(f);

End.

Процедуры обработки нетипизированных файлов

Rename ( f; NewName) - переименовывает физический файл, ранее связанный с файловой переменной f, в имя NewName;

Erase (f) - стирает физический файл, связанный с файловой перемен­ной f, с носителя информации (удаляемый файл должен быть закрыт);

GetDir (drive : Byte; Var S : String) - возвращает в строке S текущее имя каталога на диске с индексом drive;

ChDir (S : String) - устанавливает текущим каталог с именем, содержа­щимся в S;

MkDir (S : String) - создает каталог с именем S на диске;

RmDir (S : String) - удаляет пустой каталог с именем S с диска.