Опубликован: 03.09.2010 | Доступ: свободный | Студентов: 2844 / 490 | Оценка: 4.11 / 3.69 | Длительность: 10:38:00
Лекция 3:

Типы данных, определяемые программистом

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >

Бестиповые файлы

Бестиповые файлы предназначены для хранения участков оперативной памяти на внешних носителях. После описания файловой переменной

var имя : file;

ее требуется связать с физическим файлом с помощью процедуры assign. Чтение и запись производится через буфер 'порциями', равными размеру буфера. Размер буфера, отличающийся от стандартного (128 байт), можно задать с помощью второго параметра процедур reset и rewrite при открытии файла.

reset(var f : file; bufsize : word)
rewrite(var f : file; bufsize : word)

Размер буфера должен находиться в пределах от 1 байта до 64 Кбайт.

Собственно чтение и запись выполняются с помощью процедур blockread и blockwrite.

blockread(var f : file; var x; count : word; var num : word);
blockwrite(var f : file; var x; count : word; var num : word);

Процедура blockread считывает в переменную x количество блоков count. Длина блока равна размеру буфера. Значение count должно быть больше или равно 1, за одно обращение нельзя ввести больше 64 Кбайт. При вводе никаких преобразований данных не выполняется. Необязательный параметр num возвращает количество прочитанных блоков.

Процедура blockwrite записывает в файл количество блоков, равное count, начиная с адреса, заданного переменной x. Длина блока равна длине буфера. Необязательный параметр num возвращает число успешно записанных блоков.

Для бестиповых файлов применяется как последовательный, так и прямой доступ.

Пример. Программа выполняет ввод вещественных чисел из текстового файла и запись их в бестиповой файл блоками по четыре числа ( пример 3.6).

program create_bfile;
var buf   : array[1 .. 4] of real;
    f_in  : text;
    f_out : file;
    i, k  : integer;
    name_in, name_out : string;
begin
{$I–}
    writeln('Введите имя входного файла'); readln(name_in);
    assign(f_in, name_in); reset(f_in);
    if IOResult <> 0 then begin
        writeln('Файл ', name_in,' не найден'); exit end;
    writeln('Введите имя выходного файла');    readln(name_out);
    assign(f_out, name_out); rewrite(f_out, sizeof(real) * 4);
{$I+}
    i := 0;
    while not eof(f_in) do begin
        inc(i);
        read(f_in, buf[i]);
        if i = 4 then begin
            blockwrite(f_out, buf, 1); i := 0; end;
    end;
    if i <> 0 then begin
        for k := i + 1 to 4 do buf[k] := 0;
        blockwrite(f_out, buf, 1);
    end;
    close(f_in); close(f_out);
end.
Листинг 3.6. Запись в бестиповой файл

Компонентные файлы

Компонентные файлы применяются для хранения однотипных элементов в их внутренней форме представления. Тип компонент задается после ключевых слов file of.

var имя : file of тип_компонент;

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

type mas = array [1 .. 100] of real;
var a, b : mas;
    f    : file of mas;
begin
    assign(f, 'some_file.dat'); rewrite(f);
    ...
    write(f, a, b);
    close(f)
end.

Обратите внимание, что компонентой этого файла является массив целиком. За одну операцию записывается или считывается столько компонент, сколько перечислено в процедурах write или read.

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

Прямой доступ

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

С помощью стандартной процедуры seek производится установка текущей позиции в файле на начало заданного блока, и следующая операция чтения-записи выполняется, начиная с этой позиции. Первый блок файла имеет номер 0.

Ниже описаны стандартные подпрограммы для реализации прямого доступа.

filepos (var f) : longint

Функция возвращает текущую позицию в файле f. Для только что открытого файла это будет 0.

filesize (var f) : longint

Функция возвращает количество блоков в открытом файле f.

seek (var f; n: longint)

Процедура выполняет установку текущей позиции в открытом файле (позиционирование). В параметре n задается номер блока, к которому будет выполняться обращение.

truncate (var f)

Процедура устанавливает в текущей позиции признак конца файла и удаляет все последующие блоки.

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

program get_bfile;
var buf      : array[1 .. 4] of real;
    f        : file;
    i, k     : integer;
    filename : string;
begin
{$I–}
    writeln('Введите имя входного файла'); readln(filename);
    assign(f, filename);
    reset(f, sizeof(real) * 4);
    if IOResult <> 0 then begin
        writeln('Файл ', filename, ' не найден'); exit end;
{$I+}
    while true do begin    
        writeln('Введите номер записи или –1 для окончания'); 
        readln(k);
            if (k > filesize(f)) or (k < 0) then begin
                writeln('Такой записи в файле нет',); exit end;
        seek(f, k);
        blockread(f, buf, 1);
        for i:= 1 to 4 do write(buf[i]:6:1);
    end;
    close(f);
end.
Листинг 3.7. Чтение из бестипового файла

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

Совместимость типов

Операнды в выражениях должны быть совместимых типов. Совместимость типов величин, участвующих в каждой операции, достигается при выполнении по крайней мере одного из следующих условий.

  • Оба типа одинаковые.
  • Оба типа вещественные.
  • Оба типа целочисленные.
  • Один тип является поддиапазоном другого.
  • Оба типа являются отрезками одного и того же основного типа.
  • Оба типа являются множественными типами с совместимыми базовыми типами.
  • Один тип является строковым типом, другой — строковым типом или типом pchar.
  • Один тип — pointer, другой — любой тип указателя.
  • Один тип — pchar, другой — символьный массив с нулевой базой вида array [0 .. X] of char (только при разрешении расширенного синтаксиса директивой {$X +}).
  • Оба типа являются указателями идентичных типов (только при разрешении расширенного синтаксиса директивой {$X+}).
  • Оба типа являются процедурными с идентичными типами результатов, одинаковым числом параметров и соответствием между параметрами.

Совместимость по присваиванию

Этот вид совместимости требуется при присваивании значений, например в операторе присваивания или при передаче значений в подпрограмму.

Значение типа T1 является совместимым по присваиванию с типом T2 (то есть допустим оператор T1 := T2 ), если выполняется одно из следующих условий.

  • T1 и T2 — тождественные типы (кроме файловых или типов, содержащих элементы файлового типа).
  • T1 и T2 — совместимые порядковые типы, при этом значения типа T2 попадают в диапазон возможных значений T1.
  • T1 и T2 — вещественные типы, при этом значения типа T2 попадают в диапазон возможных значений T1.
  • T1 — вещественный тип, а T2 — целочисленный.
  • T1 и T2 — строковые типы.
  • T1 — строковый тип, а T2 — символьный ( char ).
  • T1 и T2 — совместимые множественные типы, при этом все значения типа T2 попадают в диапазон возможных значений T1.
  • T1 и T2 — совместимые типы указателей.
  • T1 — тип pchar, а T2 — строковая константа (только при разрешении расширенного синтаксиса директивой {$X+} ).
  • T1 — тип pchar, а T2 символьный массив с нулевой базой вида array [0 .. n] of char (только при разрешении расширенного синтаксиса директивой {$X+}).
  • T1 и T2 — совместимые процедурные типы.
  • T1 представляет собой процедурный тип, а T2 — процедура или функция с идентичным типом результата и соответствующими параметрами.

На этапе компиляции и выполнения выдается сообщение об ошибке, если совместимость по присваиванию необходима, а ни одно из условий предыдущего списка не выполнено.

< Лекция 2 || Лекция 3: 12345 || Лекция 4 >
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.

Иван Огородников
Иван Огородников
Россия, Ханты-Мансийск
Иван Шихалев
Иван Шихалев
Россия, Екатеринбург