Для более тонких операций над текстовыми файлами используют паскалевский метод доступа.
1. Для доступа к текстовым файлам используется переменная типа TextFile, которую объявляют в разделе описания переменных:
Var
t: textfile;
f: textfile;
2. При открытии файла для работы, в данную переменную передается адрес и имя выбранного файла с помощью функции AssignFile:
с использованием компонента Opendialog:
AssignFile(t, OpenDialog1.FileName);
или указав абсолютный адрес файла:
AssignFile(t, 'c\my_dat\program.ini');
Здесь:
C - расположение файла на диске;
my_dat - папка, в которой находится файл;
program.ini - имя файла.
В дальнейшем, данная переменная t служит источником информации при работе с файлом.
3. Затем, для определенного вида работ, необходимо открыть файл. Для этого имеется три функции:
Ø Rewrite(t) - создает новый (пустой) файл или уничтожает старый (без предупреждения) и создает новый пустой файл для последовательных записей;
Ø Reset(t) - открыть файл для чтения-записи (сначала):
Ø Append(t) - файл есть и его надо открыть для дописывания строк в конец файла:
4. В конце работы открытый файл нужно закрыть: CloseFile(t);
Иначе часть информации может быть потеряна.
Чтение предварительно открытого файла:
ReadLn(t, s) - будет прочитанна вся текущая строка и позиция чтения переведена на следующую строку. S описана как string;
ReadLn(t,a,b) - будет прочитанны переменные a, b, автоматически произойдет преобразование типа данных string к тому типу данных, каким описаны переменные a, b и позиция чтения будет переведена на следующую строку.
Иными словами, конвертация чисел в строки и обратно выполняется процедурами Str и Val.
При таком чтении переменные a,b должны иметь один и тот же тип данных. Например: var a, b: real;
Не допускается чтение разнотипных данных. например a: string; b: real;
Допускается последовательное чтение переменных отличных от описания типа string:
Read(t, a)- позиция чтения не будет переведена на следующую строку, а остановится перед следующей переменной b, которую затем также можно прочитать - Read(t, b). Для перехода на следующую строку служит пустой оператор чтения - Readln(t);
Запись в текстовый файл:
Запись целой строки: Writeln(t,s);
Запись кусочка строки (т.е. следующая операция записи будет произведена в ту же строку): Write(t,s);
Если переменная S содержит больше 255 символов (т.е. является длинной строкой), то таким способом она не запишется, в файл вместо строки попадут 4 байта указателя на нее. Надо делать так:
Writeln(t,pointer(s)^); где pointer(s)^ -указатель на строку (адрес строки).При сохранении данных из рабочей программы в текстовый файл, все переменные необходимо преобразовать к типу string. (смотри раздел - Преобразование типов данных) В ПАСКАЛЕ, при сохранении данных в текстовый файл, допускается следующий вид преобразования переменных, отличных от типа string: Writeln(t, a:10:3, b:12:3); Здесь: a, b - описаны в программе типом real; Конструкция a:10:3 -преобразует вещественный тип данных в символьный. Цифра 10 - означает, что под число отводится 10 символов (каждай символ - 1 байт), цифра 3 - сколько знаков показать в дробной части.Тоже самое для переменной b - 12 символов, 3 знака после запятой.
Пример (описан в разделе Динамические массивы):
unit Unit1;
Interface
.................................
.................................
Var
x: array of real;
y: array of real;
t: textfile; // объявили файловую переменную
Procedure read_text; // объявили переменную процедурного типа
.................................
.................................
Implementation
{$R *.dfm}
Procedure read_text; // реализация переменной процедурного типа
Begin
SetLength(x,1);
SetLength(y,1);
i:=0;
while not eof(t) do begin // читаем файл до конца
if length(x)<=i then begin // уведичиваем длину массива
setlength(x, length(x)+1);
setlength(y, length(y)+1);
end;
readln(t, x[i],y[i]); // читаем файл по строкам
inc(i);
end; //while
closefile(t);
end; // Procedure read_text
.................................
.................................
if opendialog1.execute then begin
assignfile(t,opendialog1.filename); //передали в файловую переменную адрес файла
reset(t); // команда на чтение-запись сначала
read_text; // обращение к процедуре чтения
end;
.................................
.................................
End.
ТИПИЗИРОВАННЫЕ ФАЙЛЫ
Типизированные файлы - это файлы, в которых содержатся записи одного типа фиксированной длины. Работа с такими файлами не сложнее, чем работа с текстовыми файлами. Добавляется только одно новое свойство. Если текстовые файлы чисто последовательные, то в типизированных файлах можно перемещаться на любую запись и затем, производить чтение, редактирование данной записи с последующим сохранением в то же место файла. До недавнего времени такие файлы называли как 'файл прямого доступа'
Типизированный файл объявляется в разделе описания переменных Var - в интерфейсной или исполняемой части программы:
<имя файла>: file of <тип файла>
Например, в программе объявлена следующая запись:
Type
M_cod = record // тип_имени_ записи
data_set: string[20];
adr: string[100]
obgect: string[50];
Tip_obg: string[30];
n_obg: string[10];
n_swid: string[10];
wlad: string[50];
end; // type
.......................................
Var
cod: M_cod; // <имя записи>: < тип_имени_ записи>;
index_file: file of M_cod;
Требуется эти данные сохранить в файл. Зададим имя данного файла и его тип. В разделе описания переменных делаем объявление -
index_file: file of M_cod;
где
index_file - имя созданного файла;
M_cod - тип файла, соответствующий типу объявленной записи - record;
В качестве типов не могут использоваться динамические структуры, такие как динамические массивы, длинные строки, указатели. Все записи должны быть одинаковой длины и не указывать на внешние данные.
Работа с типизированным файлом аналогична работе с текстовым файлом,
т.е. файл открывается теми же функциями: assign, reset, rewrite. Для чтения/записи типизированного файла, в отличии от текстового, используются только функции Read и Write!!!
В отличии от текстовых файлов, функция Reset в типизированных файлах,
открывает последний для чтения/записи с любой позиции.
Для работы с типизированными файлами добавлены новые функции:
Seek | Используется для перемещения указателя на нужную запись. |
FileSize | Возвращает число записей в файле (но не длину файла!) |
FilePos | Возвращает текущую позицию в файле |
Truncate | Обрезает файл от текущей позиции |
Рассмотрим примеры работы с типизированным файлом:
Пример 1: Открываем существующий файл и читаем его. Если файл отсутствует, то создаем его.
..................................
..................................
Interfase
..................................
Type
M_cod = record // объявили тип записи
n_zap: longint;
data_set: longint;
n_grup: string[30];
grup: string[10];
Tip_obg: string[30];
obgect: string[30];
n_obg: byte;
n_swid: string[10];
wlad: string[10];
end;
.........................................
Var
сod: M_cod; // Задали имя записи
index_file: file of M_cod; // задали имя типизированному файлу
fp, FPos: longint; // число записей в файле, номер записи
path: string;// адрес расположения данных + имена файлов
.........................................
.........................................
Implementation
.........................................
.........................................
Procedure <открытие и чтение типизированного файла>
Begin
fp:=0;
Assignfile(index_file,path+'.ind');//указан абсолютный адрес
{$I-} //ключ - проверка на наличие файла
Reset(index_file);
{$I+} //ключ - закрыть проверку на наличие файла
if (IOResult <> 0) then begin // IOResult - системная //переменная - содержит код ошибки. Если успешно, то IOResult=0.
Rewrite(index_file); // файл отсутствует на диске. //Создаем новый для записи и чтения
fp:=-1;
exit; // покинули процедуру
end
else begin
fp:=filesize(index_file); //определяем количество записей
end;
for j:=0 to fp-1 do begin // последовательно читаем записи и //что то с ними делаем
read(index_file,cod);
....................
....................
здесь что то делаем с записями
....................
....................
end;//for
end;// procedure
Пример 2. Поиск конца файла и его дополнение
....................
....................
seek(index_file,filesize(index_file));// нашли конец файла
write(index_file,cod);// дополнили файл
....................
....................
Пример 2. Поиск нужной записи, ее чтение и перезапись
....................
....................
seek(index_file,FPos);// позиционируем файл на нужную запись по //ее номеру - FPos
with cod do read(index_file,cod);//читаем запись
....................
здесь что то делаем с записью
....................
seek(index_file,FPos); //позиционируем файл на //отредактированную запись по ее номеру - FPos
write(index_file,cod);//перезаписываем
....................
....................
Ключевое слово with устанавливает значения полей записи с именем COD.