Процедуры и функции для текстовых файлов
Тектовые файлы
Стандартная конструкция редактирования файла
Как добиться прямого доступа??
Процедуры и функции для типизированных файлов
1) Procedure read(var f; v1,v2,..,vn); {Позволяет читать из файла данные которые записываются в переменные v1,v2,..,vn}
Var f:file of integer;
X:integer;
Begin
Assignfile(f,’1.tst’);
Reset(f);
While not eof(f) do begin
Read(f,x); write(x);
End;
Closefile(f);
End.
{Пока не достигнут конец файла мы считываем из файла f число интежер и выводи на консоль}
2) Procedure write (var f,v1,v2,..,vn) {записывает в файл Ф данные v1,v2,..vn}
Var f:file of integer;
X,i:integer;
Begin
Assignfile(f,’1.tst’);
Rewrite(f);
For i:=1 to n do begin
Read(x); write(f,x);
End;
Closefile(f);
End.
{Плохое копирование}
Var fin,fout:file of byte;
B:byte;
Begin
Assignfile (fin,’test.tst’);
Reset(fin);
Assignfile(fout,’test.new’);
Rewrite(fout);
While not eof(fin) do begin
Read(fin,b);
Write(fout,b);
End;
Closefile(fin);
Closefile(fout);
End.
{Возникают проблемы с памятью}
{Просто пример}
Var fch:file of char;
Ch:char;
Begin
Assignfile(fch,’test.tst’);
Reset(fch);
For ch:=’A’ to ‘Z’ do
Write(fch,ch);
Closefile(fch);
End.
3) Function filesize(var f):longint; {Размер файла в компанентах}
4) Function filepos(var f):longint; {Возвращает номер позиции текущей компоненты}
For i:=1 to filesize(f) do begin
Read(f,x);
……
End.
5) Procedure seek(var f; n:longint); {Перемещене курсора на указанную позицию. У первого компонента ноль. У последнего Фаилсайз-1}
6) Procedure truncate(var f); {Обрезает фаил с текущей позиции до конца файла}
Seek(f,filesize(f) div 2);
Truncate(f);
Type base=….;{Базовй тип компонентов файла}
Var f:file of base; buf:base;
Begin
Assignfile(f,’test.tst’);
{$I-}
Reset(f);
{$I+}
Ioresult<>0 then begin
Writeln(‘ошибка’); halt(1);
End;
While not eof (f)do begin
Read(f,buf); {Изменение буфера
Buf:=…}
Seek(f,filepos(f)-1);
Write(f,buf);
End;
Closefile;
End.
Текстовый файл – в паскале как совокупность строк переменной длины
Доступ к каждой строке возможен только последовательно, начиная с первой
Служебные символы:
1) #13 – cr (carrage return) write(#13); {Переход на начало строки}
2) #10 – lf (line fit) write(#10) {переход на новую стоку}
3) #9 – Ht {Горизонтальная табуляция}
4) #26 – EOF (end of line)
5) #32 – SP {Пробел}
1) Procedure reset(var f) {ОТкрывает}
2) Procedure rewrite (var f) {пЕрезапись}
3) Procedure append (var f)
Var f:text;
Begin
Assigfile(f,’1.txt’);
Append(f);
Write(f,’.’);
Closedile(f);
End.
4) Procedure settextbuf (var f:text; var buf; [size:word {необязательно}]); {Позволяет установить буфер ввода вывода для текстового файла}
Var buffer:array[1..4096] of char;
F:text;
Filename:string;
Assignfile(f,filename);
Settextbuf(f,buffer,4096);
Reset(f);
{Использывать только тогда, когда фаил закрыт}
5) Procedure read(var f,v1);
a. Параметры считывания не могут быть переменные типа Boolean И перечислемого типа
b. Если параметрами считывания являются символы, то при вызове процедуры read выполняется чтение одного символа, и значение символа присваивается v{}. Если указатель файла достиг конца очередной строки то результатом чтения будет символ с кодом 13, а если указатель достигнет конца файла то результатом чтения будет символ с кодом 26
c. Если считывание осуществляется с readln, то после считывания одного символа указатель переставляется за символ EOL, тоесть на начало другой строки
d. При считывание переменных типа string[N] с позиции курсора считывается строка длиной N. При использовании процедуры read, признак EOL не позволит проитать дальше. Обязательно использование процедуры readln;
Var f:text; str:string;
Begin
Assignfile(f,’1.txt’);
Reset(f);
While not eof(f) do begin
Read(f,str);{readln} writeln(str);
End;
Close(f);
End.
e. При считывании числовых данных, процедура read выделяет подстроку которая может быть преобразована в число, вырезая из нее пробелы, символы табуляции, и тому подобное. Если при пропуске пробелов встретится символ eof, то переменная получает значения ноль.
{Считывания массива данных. }
Const n=100;
Var f:text; I:integer;
Mas:array[1..n] of real;
Begin
Assignfile(f,1.txt,);
Reset(f); i:=1;
While not eof (f) and(i<=n) do begin
Read(f,mas[i]); inc(i);
End;
Closefile(f);
End.
6) Procedure write (var f, v1);
Var f:text; ch:char; st:string;
X:integer; r:real;
……………………………………..
Write(f,ch:10);
Write(f,st:100);
Write(f,x:5); write(f,r::8:2);
7) Function EOLN(var f:text):Boolean; {Возвращает ТРУ если указатель стоит на признаке конец строки}
8) Function seekEOF(var f:text):boolean; {Возвращает значение ТРУ если можно достичь конца файла минуя пробелы табуляции и признаки конца строки}
9) Function seekEOLN (var f:text):Boolean; {Возвращает тру если можно достичь конца строки минуя лишь пробелы и символы табуляции}