Процедуры обработки файла

Read(F,<список ввода>) ‑ читает из открытого файла F в указанные пере­мен­ные из списка ввода такого же типа, что и компоненты файла.

Write (F,<список вывода>) ‑ записывает в открытый файл F значения из указанных переменных из списка такого же типа, что и компоненты файла.

Seek(F;N:Longint) ‑ устанавливает текущую запись файла под номером N (отсчет записей с нуля).

           

Закрытие файла осуществляется процедурой CloseFile(F).

Erase(F) ‑ удаляет с диска файл F.

 

Файлы последовательного доступа

Общая схема создания последовательного файла: открытие файла (AssignFile, Rewrite), цикл формирования и вывода записей (Write), зак­ры­тие файла (CloseFile).

Порядок чтения последовательного файла: открытие файла (AssignFile, Reset), цикл чтения и обработки записей (Read), закрытие файла (CloseFile).

Файлы прямого доступа

Delphi не имеет специальных фай­лов с прямым доступом, а используется последовательный файл, до­­пус­ка­ющий прямой метод доступа. Общая схема создания файла: cоз­дать пустой последовательный файл с максимально до­пустимым числом пус­тых запи­сей (форматирование файла), а затем создать после­до­ва­тель­ный файл и обращаться к записям по их поряд­ковому номеру, используя про­­цедуру Seek (F,<номер записи>), а затем Read или Write соответственно.

 

Можно проверить, существует ли нужный файл, оператором FileExists:

if FileExists('FileName.ini')

then Read(SaveF, SaveV);


При последовательном чтении из файла рано или поздно будет достигнут конец файла, и при дальнейшем чтении произойдёт ошибка. Проверить, не достигнут ли конец файла, можно оператором EOF (аббревиатура E nd O f F ile), который равен true, если указатель установлен в конец файла:


while (not EOF(SaveF)) do

Read(SaveF, SaveV);


Оператор Truncate(SaveF) позволяет отсечь (стереть или, если хотите, удалить!) все записи файла, начиная от текущей позиции указателя, и до конца файла.

FilePos(F):longint ‑ возвращает текущую позицию в нетекстовом файле F. Началу файла соответствует позиция 0.

FileSize(F):Integer ‑ возвращает текущий размер нетекстового файла.

IOResult:Integer ‑ возвращает код ошибки в последней выполненной опе­ра­ции ввода/вывода: 0 ‑ ошибок нет, 2 ‑ нет файла, 3 - ошибка в имени фай­ла, 4 ‑ много открытых файлов, 5 ‑ файл недоступен, 100 ‑ конец файла, 101 ‑ диск переполнен, 106 ‑ ошибка ввода‑вывода. Используется при ди­рективе компилятора {$I‑}.

Rename(F;S) ‑ изменяет имя внешнего файла F на S.

Преимущества типизированных файлов:

 - компактное хранение данных, для внешнего представления которых требуется значительно больше памяти, чем для внутреннего (числа, записи);

- удобство работы с компонентами сложной структуры (за счет чтения-записи компонентов целиком).

- для типизированных файлов возможна запись в файл, открытый для чтения.

           

Нетипизированный файл (бестиповый)

Файл рассматривается как последовательность байтов, заканчивающаяся символом eof, и обрабатывается(считывается и записывается) блоками записей - совокупностей байтов заданной программистом длины.

Описание var <ф.п.>:file;  

Нетипизированный файл совместим с файлом любого типа. Это означает, что любой уже созданный файл (текстовый, типизированный, нетипизированный) может быть открыт и считан как нетипизированный, по байтам; с другой стороны, любое данное из оперативной памяти может быть по байтам записано в нетипизированный файл, который затем можно открыть и обрабатывать как текстовый, типизированный или нетипизированный.

Открытие и закрытие файла производится аналогично типизи­ро­ван­но­му файлу. Но в процедурах Reset и Rewrite вторым пара­мет­ром типа можно указать длину записей в байтах.

Вместо процедур Read и Write используются процедуры:

BlockRead(F;var Buf;N:Integer[;var R:Integer]) ‑ читает N записей из файла F в переменную B. Истинное количество считанных записей в R.

BlockWrite(F;var Buf;N:Integer[;var R:Integer]) ‑ выводит N записей из переменной B в файл F. Истинное количество выведенных записей в R.

 




Общая структура нетипизированного файла и схема обработки

Запись
Блок


 

eof

 


                                           чтение  

Буфер
                                    запись

 

 



Основные понятия

Мы все время рассматривали задачи, в которых данные поступают с клавиатуры, а результаты выводятся на экран. Ни исходные данные, ни результаты не сохраняются. А если данных слишком много? Как записать их на диск? Для этого необходимо исходные данные и результаты оформить в виде файлов, которые хранятся на диске.

Файлы – это поименованная структура данных на техническом носителе, представляющая собой последовательность элементов (записей) одного типа или - это массив переменной длины неограниченного размера.

Файл может быть компонентом другой структуры, но не должен входить в другой файл.

Отличие файла от массива: размещение на внешнем носителе, длина файла не задается, место элемента не определяется индексом.

Файлы бывают:

  • типизированные
  • нетипизированные
  • текстовые

Файл объявляется в разделе описания переменных с указанием типа элементов файла.

Например:

Var F1: file of integer; F2: file of char; F3: text; F4: file;
Типизированными файлами называются файлы, в описании которых присутствует указание типа. Типизированные файлы – это файлы с прямым доступом к компонентам (записям).
Нетипизированный файл – это просто последовательность байтов, без конкретизации структуры.

Файл, компонентами которого являются данные символьного типа, называется текстовым. Отличие текстовых файлов от типизированных - наличие строковой структуры. В текстовые файлы можно записывать любую информацию, в том числе числа. При этом они (числа) автоматически преобразуются в строковые величины, а при считывании из файла – обратное преобразование в числа.

Описание файлов:

 

Тип файла Описание файла
Типизированный Var F1: file of integer; F2: file of char;
Нетипизированный Var F3: file;
Текстовый Var F: text;

Файл на техническом носителе определяется полным именем (<путь>\<собственно имя>.<расширение>). Для обозначения файла и работе с ним в программе используется файловая переменная.

Файловая переменная - это переменная, используемая в программах для обозначения файла и обращения к нему. Она не может использоваться как обычная переменная (слева от знака присваивания, в логических и арифметических выражениях).
Особенности файловой переменной:

  1. Ей нельзя присваивать какие-либо значения
  2. Она не может участвовать в логических операциях
  3. Она не может входить в математические выражения

При работе с файлом используется понятие указателя или индекса файла, т.е. положение магнитной головки в определенном месте файла. Перед началом работы файл должен быть создан или открыт, по окончании работы – закрыт.


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

Процедура Назначение Замечание
Assign(f, ‘name’) Связывает файловую переменную с конкретным файлом (привязывает переменную к имени файла). Ставится перед первым использованием файловой переменной. Можно имя файла ’name’ задавать через строковую перемен­ную (S): Assign(f, S)
Reset(f) Открывает существующий файл и устанав­ливает указатель на начало записи. Для любых файлов
Rewrite(f) Создает новый пустой файл, устанавливает указатель - на начало файла. Если файл су­ществовал, то его содержимое уничтожается. Для любых файлов
Close(f) Закрывает открытый файл Для любых файлов
Erase(f) Стирает предварительно закрытый файл Для любых файлов
Rename(f, f1) Переименовывает файл f в файл f1. Файл f должен быть предварительно закрыт Для любых файлов
EOF(f) Получение сведений о конце файла True, если указатель указывает на метку конца файла, иначе - False Логическая функция.
Read(f,v1,…vn) Считывает записи из файла f в переменные v1, …vn Для типизированных и нетипизированных фай­­лов
Write(f,v1,…vn) Записывает в файл f значения переменных v1,…vn Для типизированных и нетипизированных фай­­лов
Readln(f,v1,…vn) Считывает записи из файла f в переменные v1, …vn в типизированных фай­лах недопус­ти­мо
Writeln(f,v1,…vn) Записывает в файл f значения переменных v1,…vn в типизированных фай­лах недопусти­мо
N:=filesize(F); Определение количества записей в файле Функция
Eoln(f) True, если указатель на метке конца строки, иначе - False Логическая функция. Для текс­товых фай­лов
Append(f) Открывает файл и устанавливает указатель на метку конца файла Применяется для до­­бавления записей
N:=filepos(f) Выдает номер записи, на которую указывает указатель записи. Первая запись имеет номер 0. Функция
seek(f,n) Устанавливает указатель на запись с номером n  
truncate(f) Отсекает все записи, находящиеся после указателя и в этой позиции записывает метку конца файла.  

Пимеры программ:

  • Пример записи типизированных файлов:

var f: filt of integer;

assign(f, ‘file’); … rewrite(f); …write(f, v1,v2,…, vn); clos(f);

 

  • Пример считывания типизированных файлов:

var f: filt of integer;

assign(f, ‘file’); … reset(f); … read(f, v1,v2,…, vn); clos(f);

 

  • Пример записи в текстовый файл:

uses crt;

var f:text; r,i:integer; rr:string;

begin

clrscr;

rr:='Dautova';

assign(f,'dddddd');

rewrite(f);

writeln(f,rr);

for i:=1 to 20 do begin

r:=random(10);

writeln(f,r); end;

close(f);

end._

 

  • Считывание из текстового файла (см программу выше):

uses crt;

var f:text; r,i:integer; rr:string;

begin

clrscr;

assign(f,'dddddd');

reset(f);

readln(f,rr);

writeln(rr);

for i:=1 to 20 do begin

readln(f,r);

writeln(r); end;

close(f);

end._

 

  • Написать программу, вычисляющую корни квадратного уравнения и вывести результаты в файл.

Uses crt;

Var a,b,c,x1,x2, d: real; f:text;

Begin

Assign(f,’result.txt);

Rewrite(f);

Readln(a,b,c);

D:=b*b-4*a*c;

If d>=0 then

Begin

X1:=-b+sqrt(d)/(2*a);

X2:=-b-sqrt(d)/(2*a);

End;

Writeln(‘решени квадратного ур-я’);

Writeln(f,'a=',a:6:3,'b=', b:6:3,'c=',c:6:3);

If d<0 then writeln(f,’у урав-я нет корней’) else writeln(f, ‘корни: x1=’, x1:6:3,’x2=’, x2:6:3);

Close(f);

Writeln(‘рез-ты работы программы в файле result.txt’);

Repeat until keypressed; end.

 

  • На диске имеется файл с именем Karl.txt, в котором записана скороговорка:

"Карл у Клары украл кораллы, Клара у Карла украла кларнет."

Требуется подсчитать кол-во букв «К»

Uses crt;

Var f:text; s:integer; a:char;

Begin

Assign(f,’Karl.txt’); Reset(f);

S:=0;

While not eof(f) do Begin

While not eoln(f) do Begin

Read(f,a); If a=’k’ then s:=s+1;

End;

Readln(f);

End;

Close(f); Writeln(s);

Repeat until keypressed; end.

  • Ввести текст в текстовый файл f1. Переписать файл f1 в f2 – первую половину файла в прямом, а вторую – в обратном порядке следования символов.

Uses crt;

Var f1,f2:text; s,s1,sa,sb:string; a:char; n,y,i:integer;

Begin

Clrscr;

Assign(f1,’file1’); Assign(f2,’file2’);

Rewrite(f1);

Readln(s); Writeln(f1,s); Close(f1);

Reset(f1); Rewrite(f2); Read(f1,s1);

N:=lenght(s1); Y:=n div 2; Writeln(y);

Sa:=’’; sb:=’’;

For i:=n downto y+1 do Sa:=sa+s1[i];

Writeln(sa);

For i:=1 to y do Sb:=sb+s1[i];

Writeln(sb);

S1:=sb+sa;

Writeln(s1); Write(f2,s1);

Close(f1); Close(f2); Repeat until keypressed; end.


 








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



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