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

UptoLike

17
Таблица 3. Процедуры и функции, работающие с текстовыми файлами.
Процедуры и функции Действие
SetTextBuf (var f: Text;
var Buf[, BufSize: Word])
Устанавливает размер буфера файла f равным
BufSize байт. Должна выполняться перед от-
крытием файла f. Буфер размещается в
переменной Buf.
Append (var f: Text)
Открывает текстовый файл f для дозаписи в
конец файла
Flush (var f : Text)
Выводит текущее содержимое буфера в физи-
ческий файл, не дожидаясь заполнения буфера
до конца. Имеет смысл только при записи в
файл.
EOLn (var f : Text): Boo-
lean
Функция возвращает TRUE, если текущая по-
зиция в файле - конец строки или конец файла,
и FALSE, если нет
SeekEOLn (var f : Text):
Boolean
Функция возвращает TRUE, если достигнут
конец строки, или перед ним стоят лишь пробе-
лы и (или) символы табуляции (#9)
SeekEOF (var f : Text):
Boolean
Функция возвращает TRUE, если достигнут
конец файла, или перед ним стоят лишь пробе-
лы, признаки концов строк и (или) символы
табуляции
Рассмотрим текст-ориентированные процедуры и функции подробнее.
1) Процедура SetTextBuf (Var f : Text; var Buf [, BufSize : Word])
служит для увеличения или уменьшения буфера ввода - вывода текстового
файла f. При интенсивном обращении к физическим файлам на диске мы ре-
комендуем увеличить число размера буфера (по умолчанию размер буфера
равен 128 байт) до нескольких килобайт, что существенно ускорит процесс
ввода-вывода. При этом не так жестко будут эксплуатироваться головки дис-
ковода. Увеличение буфера должно произойти после связывания логического
файла с физическим, но до первой операции ввода или вывода. Советуем
взять за правило менять буфер до открытия файла. Это дает гарантию безо-
пасности данных.
Задавая новый буфер, мы должны передать процедуре SetTextBuf не
только логический файл f, но и переменную Buf, в которой этот буфер будет
расположен. Тип переменной Buf не имеет значения. Важен ее размер. Буфер
18
файла начнется с его первого байта, отведенного Buf, и займет столько байт,
сколько задано в необязательном параметре BufSize.
Если в вызове процедуры число BufSize не указано, то считается что
оно равно размеру переменной Buf. Задание BufSize больше, чем размер са-
мой Buf, приведет к потере данных, “соседнихпо памяти с Buf.
Рассмотрим вариант использования SetTextBuf:
var
ft : text; { текстовый логический файл}
s:string;
Buf:array {1..4*1024} of Byte; {его новый буфер}
begin
Assign(ft, TEXTFILE.DOC); {файл связывается с диском}
SetTextBuf (ft, Buf); {меняется буфер (теперь он в пере-
менной размером 4К)}
Reset(ft); {открытие файла}
Readln(ft, …); {чтение одной записи}
Reset(ft); { возврат в самое начало файла}
{ буфер по-прежнему в Buf, 4K}
{Прочие действия с файлом ft}
end.
Будучи однажды установленным, буфер не меняет своего места и (или)
размера до следующего вызова SetTextBuf или Assign с той же файловой пе-
ременной ft.
Переменная, отводимая под буфер, должна быть глобальной или, по
крайней мере, существовать до конца работы с данным файлом. В самом де-
ле, если создать конструкцию, представленную ниже, то все
как будто
должно работать, но не будет.
procedure GetFileAndOpenIt (var f : Text);
var
Buffer:array [1..16*1024] of Byte; {буфер}
FileName:string; {имя файла}
begin
Readln(FileName); {считывается имя файла}
Assign(f, FileName);
SetTextBuf(f, Buffer); {назначение буфера}
Rewrite(f); {открытие файла f}
end.
                                                                              файла начнется с его первого байта, отведенного Buf, и займет столько байт,
     Таблица 3. Процедуры и функции, работающие с текстовыми файлами.
                                                                              сколько задано в необязательном параметре BufSize.
  Процедуры и функции                          Действие                             Если в вызове процедуры число BufSize не указано, то считается что
                                                                              оно равно размеру переменной Buf. Задание BufSize больше, чем размер са-
                              Устанавливает размер буфера файла f равным
 SetTextBuf (var f: Text;    BufSize байт. Должна выполняться перед от-       мой Buf, приведет к потере данных, “соседних” по памяти с Buf.
 var Buf[, BufSize: Word])   крытием файла f. Буфер размещается в                   Рассмотрим вариант использования SetTextBuf:
                             переменной Buf.
                              Открывает текстовый файл f для дозаписи в             var
 Append (var f: Text)        конец файла                                            ft : text;                          { текстовый логический файл}
                                                                                    s:string;
                              Выводит текущее содержимое буфера в физи-             Buf:array {1..4*1024} of Byte;      {его новый буфер}
                             ческий файл, не дожидаясь заполнения буфера            begin
 Flush (var f : Text)
                             до конца. Имеет смысл только при записи в
                                                                                        Assign(ft, ′TEXTFILE.DOC′);     {файл связывается с диском}
                             файл.
                                                                                        SetTextBuf (ft, Buf);           {меняется буфер (теперь он в пере-
                              Функция возвращает TRUE, если текущая по-
 EOLn (var f : Text): Boo-                                                                                              менной размером 4К)}
                             зиция в файле - конец строки или конец файла,
 lean                                                                                 Reset(ft);                        {открытие файла}
                             и FALSE, если нет
                                                                                      Readln(ft,   );                   {чтение одной записи}
                              Функция возвращает TRUE, если достигнут                 Reset(ft);                        { возврат в самое начало файла}
 SeekEOLn (var f : Text):
                             конец строки, или перед ним стоят лишь пробе-                                              { буфер по-прежнему в Buf, 4K}
 Boolean
                             лы и (или) символы табуляции (#9)                        {Прочие действия с файлом ft}
                              Функция возвращает TRUE, если достигнут
 SeekEOF (var f : Text):     конец файла, или перед ним стоят лишь пробе-           end.
 Boolean                     лы, признаки концов строк и (или) символы
                             табуляции                                              Будучи однажды установленным, буфер не меняет своего места и (или)
                                                                              размера до следующего вызова SetTextBuf или Assign с той же файловой пе-
      Рассмотрим текст-ориентированные процедуры и функции подробнее.         ременной ft.
                                                                                    Переменная, отводимая под буфер, должна быть глобальной или, по
       1) Процедура SetTextBuf (Var f : Text; var Buf [, BufSize : Word]) –
                                                                              крайней мере, существовать до конца работы с данным файлом. В самом де-
служит для увеличения или уменьшения буфера ввода - вывода текстового
                                                                              ле, если создать конструкцию, представленную ниже, то все как будто
файла f. При интенсивном обращении к физическим файлам на диске мы ре-
                                                                              должно работать, но не будет.
комендуем увеличить число размера буфера (по умолчанию размер буфера
равен 128 байт) до нескольких килобайт, что существенно ускорит процесс             procedure GetFileAndOpenIt (var f : Text);
ввода-вывода. При этом не так жестко будут эксплуатироваться головки дис-           var
ковода. Увеличение буфера должно произойти после связывания логического             Buffer:array [1..16*1024] of Byte;           {буфер}
файла с физическим, но до первой операции ввода или вывода. Советуем                FileName:string;                             {имя файла}
взять за правило менять буфер до открытия файла. Это дает гарантию безо-            begin
пасности данных.                                                                       Readln(FileName);                         {считывается имя файла}
      Задавая новый буфер, мы должны передать процедуре SetTextBuf не                  Assign(f, FileName);
только логический файл f, но и переменную Buf, в которой этот буфер будет              SetTextBuf(f, Buffer);                    {назначение буфера}
расположен. Тип переменной Buf не имеет значения. Важен ее размер. Буфер               Rewrite(f);                               {открытие файла f}
                                                                                    end.
                                     17                                                                              18