Файловая позиция
Чтение или запись любого файла происходит последовательно, блок за блоком. Местоположение в файле, откуда при последующем обращении к файлу произойдет чтение или куда будет произведена запись, называется файловой позицией.
Для всех файлов, кроме текстовых, существует возможность принудительного перемещения файловой позиции в любую точку файла, а также чтение текущей файловой позиции.
Файловая позиция отсчитывается от 0.
Получение файловой позиции |
function FilePos(var f): Longint; |
Функция FilePos возвращает файловую позицию в файле F. |
function FileSize(var f): Longint; |
Функция FileSize возвращает последнюю возможную файловую позицию (ее можно рассчитать по формуле: размер файла в байтах/размер одной записи). Для файлов, размер одной записи которых составляет 1 байт, FileSize возвращает размер файла. В общем случае, FileSize возвращает количество компонентов файла. |
Установка файловой позиции |
procedure Seek(var F; N: Longint); |
Процедура Seek устанавливает файловую позицию файла F в N. |
Операции над файлом, зависящие от текущей |
function Eof(var F): Boolean; |
Возвращает True, если файловая позиция находится за концом типированного или нетипированного файла. |
function Eof [ (var F: Text) ]: Boolean; |
Возвращает True, если файловая позиция находится за концом текстового файла. Если файловая переменная отсутствует, то используется переменная Input (клавиатура). |
function Eoln [(var F: Text) ]: Boolean; |
Возвращает True, если файловая позиция находится за концом строки текстового файла. Если файловая переменная отсутствует, то используется переменная Input (клавиатура). |
procedure Truncate(var F); |
Отсекает конец файла, начиная с текущей файловой позиции. |
Задача 41. Ввести набор из N чисел, сохранить его в файле. Организовать цикл, в котором по введенному индексу определяется и выводится на экран числовое значение из файла. Предусмотреть выход их цикла.
var f:file of real;
v:real;
i,n:integer;
begin
write('Введите количество чисел: '); readln;
assign(f,'Real.fil');
Rewrite(f);
for i:=1 to n do begin {заполняем файл вещественными числами}
v:=random*1000-500;
write(f,v);
end;
close(f);{файл заполнен, закрываем его}
reset(f);{снова открываем файл (закрытие и повторное открытие файла использовано здесь только для того, чтобы показать возможность повторного открытия файла без повторного использования процедуры Assign)}
write('Введите номер: '); readln(N); {ввели индекс}
while (n>=0) and (n<=FileSize(f)-1) do begin {пока введенный индекс не вышел за пределы файла}
seek(f,n);{устанавливаем файловую позицию}
Read(f,v);{читаем число из файла}
writeln(v);{выводим его на экран}
write('Введите номер: '); readln(N); {снова вводим индекс}
end;
{вышли из цикла, так как введен недопустимый индекс}
Close(f);{закрываем файл}
readln;
end.
Задача 42. Создать программу, которая выводит на экран саму себя.
Решение данной задачи становится тривиальным, если воспользоваться файлом текста программы.
var f:text; s:string; i:byte;
begin
s:=paramstr(0); {получаем имя исполняемого файла}
s:=copy(s,1,length(s)-3)+'pas'; {заменяем расширение "exe" исполняемого файла на расширение "pas"}
assign(f,s);
Reset(f);
while not eof(f) do begin {пока не конец файла ...}
readln(f,s);{считываем строку}
writeln(s);{выводим ее на экран}
end;
close(f); {обработка завершена, закрываем файл}
readln;
end.
Задача 43. Каждая строка (до 1000) текстового файла содержит в себе набор целых чисел (до 100), разделенных пробелами. Вывести на экран содержимое файла с использованием форматирования, а так же подсчитать среднее арифметическое каждой строки файла.
Решение:
var f:text;{текстовый файл}
Ac: array[1..100] of integer; {массив чисел текущей строки}
Ar: array[1..1000] of real;{массив средних арифметических строк}
Row, Col : integer;{количество строк в файле и количество чисел в текущей строке}
i:integer;
begin
assign(f,'numbers.txt');{сопоставление}
reset(f);{открытие для чтения}
writeln('Содержимое файла NUMBERS.TXT:');
Row:=0;
while not eof(f) do begin {пока не конец файла ...}
Col:=0;
while not eoln(f) do begin {пока не конец строки файла ...}
inc(Col); {переходим к следующему числу строки}
read(f, ac[Col]); {считываем очередное числовое значение из файла в массив AC}
write(ac[Col]:6); {производим форматированный вывод}
end;
{информация из строки считана}
readln(f);{считываем маркер конца строки из файла}
writeln;{разделяем выводимые на экран строки}
inc(Row);{переходим к следующей строке массива AR для подсчета среднего арифметического}
ar[row]:=0;
for i:=1 to Col do ar[row]:=ar[row]+ac[i]; {подсчитываем сумму элементов строк}
ar[row]:=ar[row] / col; {рассчитываем среднее арифметическое}
end;
{обработка файла закончена}
Close(f);
writeln('Средние арифметические строк:');
for i:=1 to Row do write(ar[i]:7:2); {выводим на экран средние арифметические строк файла}
writeln;
readln;
end.
Если, например, файл number.txt имеет следующее содержимое:
1 34 -2 35 43 1 2 -2 -2 7 -8
23 3 45 -3 2
2 12 -21 2 43 -43 5 6 7
2 3
7 89 7
то в результате работы программы на экране появится:
Содержимое файла NUMBERS.TXT:
1 34 -2 35 43 1 2 -2 -2 7 -8
23 3 45 -3 2
2 12 -21 2 43 -43 5 6 7
2 3
7 89 7
Средние арифметические строк:
9.91 14.00 1.44 2.50 34.33
Дополнительные процедуры и функции для работы с файлами
Обработка ошибок |
function IOResult: Integer; |
Во время работы с файлами могут возникать различные ошибки. Если установлена директива компилятора {$I+}, то работа программы при этом аварийно завершается. Если установлена директива компилятора {$I-}, то с помощью функции IOResult можно определить номер последней ошибки ввода-вывода. IOResult возвращает 0, если ошибки не произошло. Если произошла ошибка, то до вызова IOResult все операции с файлами будут заблокированы |
Обработка файлов, не связанная с их содержимым |
procedure Rename(var F; Newname:string); |
Переименовывает файл, сопоставленный с файловой переменной F в Newname. Файл не должен быть открыт. |
procedure Erase(var F); |
Удаляет файл, сопоставленный с файловой переменной F. Файл не должен быть открыт. |
Обработка каталогов |
procedure ChDir(S: String); |
Переходит в каталог с именем S. |
procedure MkDir(S: String); |
Создает каталог с именем S. |
procedure RmDir(S: String); |
Удаляет каталог с именем S. |
Задача 44. Дано имя файла. Проверить, существует ли файл с таким именем он на диске.
var f:file;
s:string;
begin
write('Введите имя файла:'); readln(s);
{$I-}{отключаем проверку ошибок ввода-вывода}
assign(f,s);
Reset(f);{пытаемся открыть файл}
{$I+}{включаем проверку ошибок ввода-вывода}
if ioresult<>0 then {попытка открытия файла окончилась неудачно}
writeln ('Такого файла на диске нет')
else begin {файл открыт успешно ...}
writeln('Файл существует');
close(f);{... не забудем его закрыть}
end;
readln
end.