В Паскале файл относится к структурированным типам данных, как массив и запись. Файл представляет собой последовательность компонентов одного типа, расположенных на внешнем устройстве (например, магнитный диск). Тип компонентов файла может быть любым, кроме файлового. Количество компонентов в файле не оговаривается и ограничивается только объемом памяти на внешнем устройстве.
В Турбо-Паскале выделяют 3 типа файлов:
Описание: var <файловая переменная>: text;
Например, var f1: text;
Описание: var <файловая переменная>: file of <тип>;
Например, var f1: integer;
var f2: real;
var f3: ‘A’..’z’;
Описание: var <файловая переменная>: file;
Например, var f: file;
assign (<файловая переменная>, <имя.расширение>); - устанавливает связь между файловой переменной и именем файла на диске. Имя файла состоит из двух частей: имя (не более 8 символов) и расширение (не более 3 символов). Расширение может отсутствовать.
Например, assign(f1,’res.txt’);
Далее в программе, где будет упоминаться переменная f1 - подразумевается, что работа ведется с реальным файлом res.txt .
reset (<файловая переменная >); - открывает существующий файл для чтения.
Например, reset(f1);
rewrite (<файловая переменная >); - открывает файл для записи. Если файла нет на диске, то он создается. Если есть такой файл, то он создается заново пустым, вся старая информация стирается.
Например, rewrite(f1);
append (<файловая переменная >); - открывает файл для добавления в него новой информации (старая не стирается). Только для текстовых файлов (!).
Например, append(f1);
read (<файловая переменная >, <переменная>); - чтение одного элемента из файла, соответствующего файловой переменной, и помещение его в переменную программы. Чтение осуществляется последовательно, после чтения каждого значения, указатель в файле перемещается на следующую позицию.
Пример: Пусть на диске есть символьный файл mebel. Задача: написать программу, которая последовательно считывает из этого файла первые 4 символа и выводит их на экран.
Изобразим файл следующим образом:
1-ый байт памяти | 2-ой байт памяти | … | |||
Mebel | с |
т |
о |
л |
… |
Программа:
var F1: file of char; x: char; i:integer; Begin assign(F1,’mebel’); reset(F1); for i:=1 to 4 do begin read(F1,x); write(x); end; close(F1); End.
На экране увидим слово: стол
Для текстового файла может использоваться процедура readln, которая читает значение из файла и пропускает непрочитанную часть строки и признак конца строки.
write (<файловая переменная >, <переменная>); - запись в файл данных из переменных программы. Вывод информации осуществляется последовательно.
var f1: file of char; y: array[1..100] of integer; … for i:=1 to 100 do write(f1,y[i]);
eof (var f): boolean; - функция проверки конца файла. Возвращает true, если достигнут конец файла, иначе возвращает false.
while not eof(f) do read(f,x);
{команда читается так: пока не конец файла делай команду: чтение очередного элемента из файла, соответствующего файловой переменной f, в переменную x}
close (<файловая переменная >); - процедура закрытия файла, завершает действия с файлом. После процедуры close файловую переменную можно связать с другим файлом или снова открыть этот же файл.
assign(f2,'MyFile.txt'); rewrite (f2); … close(f2); reset(f2); … close(f2); assign(f2,'OtherFile.txt'); reset(f2); …
Пример 1: Программа, переписывающая из файла a.txt в файл b.txt все символы, кроме цифр.
var ch: char: f1,f2: text: begin assign(f1, 'a.txt'); assign(f2, 'b.txt'); reset(f1); rewrite(f2); repeat read(f1,ch); if (ch<='0') or (ch>='9') then write(f2,ch); until eof(f1); close(f1); close(f2); end.
Пример 2: Программа для вычисления и вывода в файл таблицы Пифагора (таблицы умножения).
Var i, j, n : Integer; f : Text; Begin Assign(f, ‘tab_pif.txt’); Rewrite(f); For i := 1 to 9 do begin For j := 1 to 9 do begin n := i*j; Write(n:4); {вывод результата на экран} Write(f, n:4); {вывод результата в файл; т.е., если в процедуре Write первым параметром указана файловая переменная, то вывод осуществляется не на экран, а в файл, с которым связана эта переменная в процедуре Assign } end; WriteLn;{перевод строки на экране} WriteLn(f);{перевод строки в файле} end; Close(f); End.
rename(<файловая переменная>,<новое имя файла>); - переименование файла на диске. Перед использованием этой поцедуры необходимо связать файловую переменную со старым именем файла. Если файл был открыт, то необходимо его закрыть.
Пример:
var f1,f2: text; i: integer; begin assign(f1, ‘res.txt’); rename(f1, ‘res.old’); assign(f2, ‘res.old’); rewrite(f2); for i:=1 to 20 do writeln(f2,i); close(f2); end.
erase (<файловая переменная>); - удаление файла с диска. Если файл был открыт, то закрыть, связать с файловой переменной.
assign(f,’res.old’); erase(f);
seek (<файловая переменная>, N); - перемещение в заданную позицию файла, нумерация позиций с нуля, N – номер позиции. Не используется для текстовых файлов (!).
0 |
1 |
2 |
3 |
4 |
5 |
2 |
5 |
3 |
8 |
8 |
6 |
Пример:
var f: file of integer; i: integer; begin assign(f,’a.dat’); reset(f); { N=0 } read(f,i); { i=2 } seek(f,4); { N=4 } read(f,i); { i=8 } end.
filesize(<файловая переменная>): longint; - функция, возвращает текущий размер файла (количество компонентов!).
Пример 3: Программа, меняющая порядок символов в файле на обратный.
var f1,f2: file of char; i,n: integer; ch: char; begin assign(f1,’a.txt’); assign(f2,’b.txt’); reset(f1); rewrite(f2); h:=filesize(f1); for i:=h-1 downto 0 do begin seek(f1,i); read(f1,ch); write(f2,ch); end; close(f1); close(f2); end.
При описании нетипизированных файлов не указывается тип компонентов файла, что позволяет обеспечить доступ к данным любого типа. Использование нетипизированных файлов дает возможность организовать высокоскоростной обмен данных (т.е. чтение и запись на диск).
В процедурах открытия таких файлов указывается размер записи (в байтах), считываемой или записываемой на диск.
reset(f, size);
rewrite(f, size);
Для обеспечения максимальной скорости обмена длина блока должна быть кратна размеру сектора магнитного диска (512 байт). Но размер файла может быть не кратен размеру записи, поэтому для полного чтения всего файла размер записи устанавливается равным 1 байту.
Для чтения и записи в Нетипизированные файлы используются процедуры чтения и записи блоками:
blockread (f, buf, n, res); - чтение из файла f в переменную buf (обычно массив), n – число записей, запрашиваемых на чтение, res – число реально считанных записей.
blockwrite (f, buf, n, res); - запись из переменной buf в файл f.
Пример:
var f1,f2: file; r1,r2: integer; a: array [1..4096] of byte; st1, st2: string; begin write('Введите имя исходного файла'); readln(st1); write('Введите имя нового файла'); readln(st2); assign(f1,st1); assign(f2,st2); reset (f1,1); rewrite(f2,1); repeat blockread(f1,a,4096,r1); blockwrite(f2,a,r1,r2); until r1<4096; close(f1); close(f2); end.