Pascal. Файлы. Типизированные и нетипизированные

      Комментарии к записи Pascal. Файлы. Типизированные и нетипизированные отключены

Главная Форумы Программирование Программирование на Pascal Паскаль для школьников (учебник) Pascal. Файлы. Типизированные и нетипизированные

Помечено: ,

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 мес. назад.

  • Автор
    Сообщения
  • #3745

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

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

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

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

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

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

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

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

    Решение:

    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: поменять строки в файле местами.

    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. Да и принцип их одинаков, за исключением того, что первая записывает данные в файл, а вторая считывает их из него.

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

    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.

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

Для ответа в этой теме необходимо авторизоваться.