Паскалевский метод доступа

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

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.




Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: