Теория
Сегодня мы закончим повествование о работе с файлами. Особое место в Паскале занимают текстовые файлы. Не путайте с файлами, у которых расширение txt. У текстовых файлов может быть любое расширение (в том числе и txt :). Давайте определимся, что мы будем иметь в виду, говоря "текстовый файл".
Текстовый файл - файл, состоящий из строк, которые в свою очередь состоят из символов. Строки могут иметь переменную длинну, каждая строка завершается символом конца строки.
Для работы с файлом мы должны создать файловую переменную, для текстовых файлов эта переменная стандартного типа Text.
var
F : Text;
Открываются и закрываются текстовые файлы так же как и типовые. Соответственно процедуры для чтения и записи те же. Так же можно считать/записать строку целиком с помощью процедур ReadLn / WriteLn, указав первым параметром файловую переменную.
Однако для работы с текстовыми файлами введены дополнительные функции и процедуры:
- function Eoln (var F: Text) : Boolean;
Эта функция принимает значение TRUE, если достигнут конец строки, и значение FALSE, если конец строки не достигнут. Название от англиского: EndOfLiNe - конец линии (строки).
- function SeekEoln (var F: Text) : Boolean;
Возвращает значение TRUE, если до конца строки остались только пробелы, и FALSE в противном случае.
- function SeekEof (var F: Text) : Boolean;
Возвращает значение TRUE, если до конца файла остались только строки из пробелов, и FALSE в противном случае.
- procedure Append(var f: Text);
открывает текстовый файл для дозаписи в конец файла.
- procedure SetTextBuf(var F: Text; var Buf; Size: Word );
служит для увеличения или уменьшения буфера ввода - вывода текстового файла f. Значение размера буфера для текстовых файлов по умолчанию равно 128 байтам. Увеличение размера буфера сокращает количество обращений к диску. Рекомендуется изменять размер буфера до открытия файла. Буфер файла начнется с первого байта переменной Buf. Размер буфера задается в необязательном параметре Size, а если этот параметр отсутствует, размер буфера определяется длиной переменной Buf.
- procedure Flush(var F: Text);
применяется к открытым для записи файлам. Она принудительно записывает данные из буфера в файл независимо от степени его заполнения.
Несмотря на такое внимание к текстовым файлам принципы работы с файлами остаются прежними. Поэтому сегодняшний выпуск посвящён им только наполовину. Вторую часть сегодняшнего повествования отведём "путешествиям" по файлам.
Вы наверно уже заметили, что до сих пор мы считывали данные из файлов последовательно. Т.е. считав k блок мы переходили к k+1 блоку. А что делать, если надо считать k+2 блок ? Конечно можно считать k+1 в "никуда". Однако если нам потребуется считать не k+2, а k+100000 :) работа с файлами по компьютерным меркам ведётся довольно медленно и считывыя бесполезные данные мы создадим тормозную программу. Думаю вам этого не хочется.
Так вот на самом деле мы можем позиционироваться в файле. Т.е. переходить сразу к нужному нам блоку. Файл условно разбивается на n - блоков. Первому блоку соответствует номер 0. Последнему - n-1. Блок с номером n - является концом файла. Будем называть номер блока - смещением относительно начала файла.
Для определения размера файла в блоках используется функция:
function FileSize(var F): Longint;
возвращает размер файла F в блоках. Помните, что в зависимости от того как представлен у вас файл (какого типа) результат может быть различным. Например:
type
fb = file of byte;
fi = file of integer;
var
f1 : fb;
f2 : fi;
begin
Assign (f1, 'E:\Result.txt');
Assign (f2, 'E:\Result.txt');
reset (f1);
reset (f2);
writeLn ('Size of f1 - ', FileSize (f1));
writeLn ('Size of f2 - ', FileSize (f2))
end.
результат на экране будет различным. Почему? Для хранения переменной типа byte в памяти отводится 1 байт, и следовательно файл будет представлен, как последовательность блоков, размером в 1 байт. Поэтому FileSize (f1) даст нам размер файла в байтах.
Для хранения же переменной типа integer отводится 2 байта, поэтому FileSize (f2) даст результат в 2 раза меньше, т.к. один блок будет у нас 2 байта.
При считавание данных из файла смещнение относительно начала меняется. Т.е. считали одно число - смещение +1, считали два - смещение +2 и т.д. Что бы узнать смещение относительно начала файла применяется функция:
function FilePos(var F): Longint;
для только что открытого файла смещение (а значит и результат FilePos) будет равно 0. Для файла дочитанного до конца FilePos = FileSize.
procedure Seek(var F; N: Longint);
эта процедура позволяет передвигать текущую позицию по файлу (номер блока указывается в N). Например начало файла: Seek (F, 0), конец Seek (F, SizeOf (F)).
procedure Truncate(var F);
эта процедура обрезает файл, устанавливая на текущее смещение символ EOF. Не может применятся к текстовым файлам.