Самоучитель игры на Паскале. ABC и немного Турбо

Предпросмотр материала:

Выберите файл для просмотра:

Всего файлов: 92

doc doc doc doc doc +87

Бинарные

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

 

Объявляем, открываем, записываем, закрываем.

 

   var

         f                                    : file;

         int                                 : integer;

         a                                    : array[1..10] of integer;

 

{открыть файл}

Assign( f, ‘a.bin’);

ReWrite( f, 1);

 

{записать что-то в файл}

BlockWrite( f, int, 2);

 

{закрыть файл}

Close(Txt);

 

Открытие бинарного файла очень похоже на таковое текстового. Только заметьте волшебную единицу в ReWrite. Так надо, поверьте!

Закрытие файла ничуть не изменилось.

А вот на записи остановимся подробнее.

Первый параметр – имя файла. Это понятно.

Второй параметр – имя переменной, значение которой мы хотим записать в файл.

 

Точнее, это так в первом приближении. На самом деле второй параметр – это адрес, начиная с которого производится запись в файл, не взирая ни на какие переменные. Но об этом пока можно забыть.

 

Третий параметр это размер записываемой переменной, или, точнее, количество записываемых в файл байтов.

 

На самом деле и это не так. Циферка 1 в открытии файла означает размер блока в байтах, то есть минимального количества данных, которое можно записать в файл и, соответственно, прочитать из него. Третий параметр в BlockWrite означает на самом деле количество записываемых блоков. Кстати, если Вы забудете задать второй параметр в ReWrite, то размер блока будет по умолчанию установлен в 128.

 

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

 

Вместо

BlockWrite( f, int, 2);

пишем

BlockWrite( f, int, SizeOf(int));

 

Незатейливая, но очень полезная функция SizeOf возвращает количество байтов, занимаемых переменной.

Если мы хотим записать в файл весь массив A, то напишем следующее:

 

BlockWrite( f, a, SizeOf(a));

или

BlockWrite( f, int, 20);

 

Но если мы напишем

 

         BlockWrite( f, int, 10);

 

то в файл попадут только первые пять элементов массива. Ещё раз – BlockWrite игнорирует, где кончается одна переменная, и где начинается другая.

 

А  теперь чтение:

 

Assign( f, ‘a.bin’);

ReSet( f, 1);

 

BlockRead( f, int, 2);

 

Close(Txt);

 

Вроде бы всё понятно. ReWrite поменяли на ReSet, BlockWrite на BlockRead.

Маленькая разница между ReSet и ReWrite.

ReWrite. Если файл есть, то он его перепишет, как его и не было – уничтожив всё содержимое. Если файла нет, то он его создаст.

ReSet. Если файл есть, то он его откроет на чтение. Если файла нет – всё кончится очень плохо. Так что проверьте существование файла перед открытием с помощью FindFirst.

Но отметим очень существенную разницу с текстовым файлом. Нам не нужно знать, что именно было записано в текстовом файле, для того, чтобы его прочитать. Достаточно знать, что этот файл текстовый. При каждом считывании из файла мы получаем одну строку. Единственно важное – вовремя остановиться, то есть не попытаться прочитать что-нибудь ещё после того, как из файла всё уже, собственно, прочитано.

С бинарным файлом не так. Чтобы прочитать его содержимое, мы должны абсолютно точно знать, что же именно в этот файл было записано. Какие переменные, каких типов, какого размера, в каком порядке. Малейшая ошибка – и на выходе куча мусора.

Так в чём преимущество бинарных файлов? А в них можно записать всё. Нет, не так – ВСЁ! И вы это ещё оцените.

 

Бинарные файлы. Задачка

Задачка простенькая. Перекопировать существующий файл под другим именем. Если бы в модуле Dos была соответствующая процедура, то это было бы делом одной строчки. Но процедуры нет. Будем делать собственными ручками.

Дело нехитрое – проверить, что файл есть, прочитать файл, записать файл. Прочитать всё сразу мы пока не умеем, так что слона будем есть по частям, мелкими кусками. Организуем цикл по количеству кусков – прочитать кусок, записать кусок. Где-то так:

 

Ввести имя входного файла

Ввести имя выходного файла

Если входной файл существует

         Цикл по количеству кусков

                   Прочитать кусок из входного файла

                   Записать кусок в выходной файл

 

Куски, безусловно, должны быть одинакового размера. Было бы хорошо, чтобы файл делился на куски без остатка. А на какое числа делится всё на свете без остатка? Правильно, на единицу! Следовательно, куски будут по одному байту. Цикл – по количеству байт в файле. А размер файла узнаем из записи SearchRec, он, размер, там есть.

Проверку на наличие файла выполним через единственный, без продолжения, FindFirst. Ну и не забыть – объявить файлы, открыть файлы, закрыть файлы.

 

program filecopy;

   uses

         Dos;

   var

         inname, outname         : string;

         infile,outfile                : file;

         SR                               : SearchRec;

         b                                  : byte;

         i                                   : integer;

begin

         write('in name = ');

         readln(inname);

         write('out name = ');

         readln(outname);

         FindFirst( inname, AnyFile, SR);

 

         if DosError = 0 then begin

           Assign( infile, inname);

           ReSet(infile,1);

           Assign( outfile, outname);

           ReWrite(outfile,1);

 

           for i:=1 to SR.size do begin

              BlockRead( infile, b, 1);

              BlockWrite( outfile, b, 1);

           end;

 

           Close(outfile);

           Close(infile);

     end;

end.

 

И небольшой комментарий. Читаем из файла мы в переменную типа byte. С тем же успехом могли бы использовать char. Главное, что переменная занимает ровно один байт, ведь используем мы её, переменную, исключительно как временный буфер для хранения этого самого байта.

 

Самоучитель игры на Паскале. ABC и немного Турбо

    RAR

Файл будет скачан в формате:

    RAR

Автор материала

Епифанцев Сергей Владимирович

Руководитель проекта.

  • На сайте: 10 лет и 9 месяцев
  • Всего просмотров: 2195
  • Подписчики: 0
  • Всего материалов: 2
  • 2195
    просмотров
  • 2
    материалов
  • 0
    подписчиков

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

Другие материалы

Вам будут интересны эти курсы: