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; |
Файл на техническом носителе определяется полным именем (<путь>\<собственно имя>.<расширение>). Для обозначения файла и работе с ним в программе используется файловая переменная.
Файловая переменная - это переменная, используемая в программах для обозначения файла и обращения к нему. Она не может использоваться как обычная переменная (слева от знака присваивания, в логических и арифметических выражениях).
Особенности файловой переменной:
- Ей нельзя присваивать какие-либо значения
- Она не может участвовать в логических операциях
- Она не может входить в математические выражения
При работе с файлом используется понятие указателя или индекса файла, т.е. положение магнитной головки в определенном месте файла. Перед началом работы файл должен быть создан или открыт, по окончании работы – закрыт.
При работе с файловыми переменными, используются специальные процедуры и функции:
Процедура | Назначение | Замечание |
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.