Файловая позиция

Чтение или запись любого файла происходит последовательно, блок за блоком. Местоположение в файле, откуда при последующем обращении к файлу произойдет чтение или куда будет произведена запись, называется файловой позицией.

Для всех файлов, кроме текстовых, существует возможность принудительного перемещения файловой позиции в любую точку файла, а также чтение текущей файловой позиции.

Файловая позиция отсчитывается от 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('Введите количество чисел: '); readlnno;

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.


<- Предыдущая страница | Следующая страница ->

Последнее изменение: Вторник 1 Март 2011, 17:18