Основы алгоритмизации и программирования. Часть четвертая. Файловая система Turbo Pascal. Асламова В.С - 10 стр.

UptoLike

19
var
ff:Text; {основная часть примера}
begin
GetFileAndOpenIt (ff);
Write(ff, …); {попытка записи в файл ff}
{Дальше неважно, что будет все равно результат уже неверный}
Дело в том, что локальная переменная Buffer (а именно в ней мы раз-
мещаем буфер открываемого файла) существует лишь во время выполнения
процедуры. После окончания она исчезает, область буфера становится обще-
доступной и наверняка очень быстро заполнится совершенно
посторонними значениями, а переданный в вызывающий блок файл f (ff)
будет вести себя непредсказуемо. При всем этом не возникнет ни ошибки
компиляции, ни ошибки во время счета.
Если размещать буфер в статической переменной, то онсъедает
часть области данных или стека. А они ограничены размером 64К, что вовсе
не так много. Выгоднее было бы размещать буфер в динамической памяти
(куче). Для этого надо объявить указатель на место буфера в куче.
var
ft:text; {файл типа текст}
PBuf:Pointer; {ссылка на буфер}
Const
BufSize=1024; {размер буфера}
begin
Assign(ft, TEXTFILE.DOC);
GetMem(Pbuf, BufSize); {в памяти отводится блок размером
с буфер}
SetTextBuf(ft, Pbuf^, BufSize); {задается буфер в динамической
памяти}
Reset(ft); {открытие файла}
{} {работа с файлом ft}
close (FT);
FreeMem( Pbuf, BufSize); {буфер удаляется из памяти (кучи)}
end.
В этом случае нужно отводить и освобождать память под буфер, а в
SetTextBuf обязательно указывать его размер, так как блок памяти с началом
Pbuf^ “не знаетсвоего размера.
В заключении посоветуем выбирать размер буфера кратным 512 байт.
Диск читается по секторам и дорожкам, и длина считываемой в одном месте
20
порции информации колеблется от 512 до 4096 байт для гибких и жестких
дисков.
2) Процедура Append(Var f : Text) служит для специального откры-
тия файлов для пополнения. Она применима только к уже существующим
физическим файлам и открывает их для дозаписи, т.е. файл не стирается, как
при вызове Rewrite, а подготавливается к записи строк в конец файла. Если
Append применяется к несуществующему файлу, то возникнет ошибка вре-
мени счета. Новый файл может быть создан только процедурой
Rewrite(var f:text).
После открытия файла процедурой Append запись в него будет проис-
ходить с того места, где находится признак конца файла (код 26). При
необходимости поменять текстовый буфер надо сделать это до открытия
файла процедурой Append. Вообще говоря, процедура Append, кроме способа
открытия файла (с конца), ничем не отличается от процедуры Rewrite.
3) Процедура Flush(Var f : Text) – применяется к файлам, открытым
для записи (процедурами Rewrite или Append). Данные для записи накапли-
ваются в буфере файла и только после полного его заполнения записываются
в физический файл. Процедура Flush принудительно записывает данные из
буфера в файл независимо от степени его заполнения. Когда буфер имеет
большую емкость, его содержимое может не попасть в физический файл, ес-
ли программа внезапно прервется в процессе счета. Этого можно избежать,
если передаварийнымичастями программы ставить вызовы Flush.
Процедура Flush не закрывает файл и не влияет на последовательность
вывода. Flush может найти применение при работе со стандартными файлами
MS-DOS: устройствами AUX, или СОМ1, СОМ2, PRN, или LPT1,..., LPTЗ.
При работе с ними данным незачемотстаиваться в буфере, и процедура
Flush поставленная после Write снимет эффект задержки буфера файла.
Стандартные функции работающие с текущим
указателем
4) Функция EOLn (VAR f : Text) : Booleanанализирует текущее
положение в текстовом файле f, открытом для чтения. Расшифровка этой
функции говорит сама за себя: “End-Of–Line” - конец строки. EOLn возвра-
щает значение TRUE, если следующей операцией будет прочитан признак
      var                                                                     порции информации колеблется от 512 до 4096 байт для гибких и жестких
        ff:Text;                               {основная часть примера}       дисков.
      begin
                                                                                    2) Процедура Append(Var f : Text) – служит для специального откры-
        GetFileAndOpenIt (ff);
                                                                              тия файлов для пополнения. Она применима только к уже существующим
        Write(ff, );                           {попытка записи в файл ff}
                                                                              физическим файлам и открывает их для дозаписи, т.е. файл не стирается, как
        {Дальше неважно, что будет все равно результат уже неверный}
                                                                              при вызове Rewrite, а подготавливается к записи строк в конец файла. Если
      Дело в том, что локальная переменная Buffer (а именно в ней мы раз-     Append применяется к несуществующему файлу, то возникнет ошибка вре-
мещаем буфер открываемого файла) существует лишь во время выполнения          мени счета. Новый файл может быть создан только процедурой
процедуры. После окончания она исчезает, область буфера становится обще-      Rewrite(var f:text).
доступной и наверняка очень быстро заполнится совершенно                            После открытия файла процедурой Append запись в него будет проис-
“посторонними” значениями, а переданный в вызывающий блок файл f (ff)         ходить с того места, где находится признак конца файла (код 26). При
будет вести себя непредсказуемо. При всем этом не возникнет ни ошибки         необходимости поменять текстовый буфер надо сделать это до открытия
компиляции, ни ошибки во время счета.                                         файла процедурой Append. Вообще говоря, процедура Append, кроме способа
       Если размещать буфер в статической переменной, то он “съедает”         открытия файла (с конца), ничем не отличается от процедуры Rewrite.
часть области данных или стека. А они ограничены размером 64К, что вовсе
                                                                                    3) Процедура Flush(Var f : Text) – применяется к файлам, открытым
не так много. Выгоднее было бы размещать буфер в динамической памяти
                                                                              для записи (процедурами Rewrite или Append). Данные для записи накапли-
(куче). Для этого надо объявить указатель на место буфера в куче.
                                                                              ваются в буфере файла и только после полного его заполнения записываются
      var
      ft:text;                           {файл типа текст}                    в физический файл. Процедура Flush принудительно записывает данные из
        PBuf:Pointer;                    {ссылка на буфер}                    буфера в файл независимо от степени его заполнения. Когда буфер имеет
        Const                                                                 большую емкость, его содержимое может не попасть в физический файл, ес-
        BufSize=1024;                    {размер буфера}                      ли программа внезапно прервется в процессе счета. Этого можно избежать,
        begin
                                                                              если перед “аварийными” частями программы ставить вызовы Flush.
         Assign(ft, ′TEXTFILE.DOC′);
          GetMem(Pbuf, BufSize);         {в памяти отводится блок размером           Процедура Flush не закрывает файл и не влияет на последовательность
                                         с буфер}                             вывода. Flush может найти применение при работе со стандартными файлами
         SetTextBuf(ft, Pbuf^, BufSize); {задается буфер в динамической       MS-DOS: устройствами AUX, или СОМ1, СОМ2, PRN, или LPT1,..., LPTЗ.
                                          памяти}                             При работе с ними данным незачем “отстаиваться” в буфере, и процедура
         Reset(ft);                      {открытие файла}                     Flush поставленная после Write снимет эффект задержки буфера файла.
         { }                             {работа с файлом ft}
         close (FT);
         FreeMem( Pbuf, BufSize);        {буфер удаляется из памяти (кучи)}         Стандартные функции работающие с текущим
        end.                                                                                     указателем
       В этом случае нужно отводить и освобождать память под буфер, а в
SetTextBuf обязательно указывать его размер, так как блок памяти с началом          4) Функция EOLn (VAR f : Text) : Boolean – анализирует текущее
Pbuf^ “не знает” своего размера.                                              положение в текстовом файле f, открытом для чтения. Расшифровка этой
      В заключении посоветуем выбирать размер буфера кратным 512 байт.        функции говорит сама за себя: “End-Of–Line” - конец строки. EOLn возвра-
Диск читается по секторам и дорожкам, и длина считываемой в одном месте       щает значение TRUE, если следующей операцией будет прочитан признак

                                    19                                                                           20