Перемещение по файлу.
Изменение положения указателя осуществляется с помощью оператора:
Seek(f, i);
где f - переменная файлового типа, i - порядковый номер элемента файла, на который необходимо установить указатель (тип переменной - longint). Например, оператор установки указателя на начало файла имеет вид:
Seek(f,0);
Функция FileSize (файловая переменная) возвращает общее число элементов файла.
Функция FilePos(файловая переменная) возвращает номер элемента, на который установлен текущий указатель.
Например,
Seek(f, FileSize(f)-1); – устанавливает указатель на последнюю запись файла (последний элемент).
Seek(f, FileSize(f)); - устанавливает указатель за последний элемент файла.
Seek(f, FilePos(f)+1) пропуск элемента.
Функция Eof(файловая переменная) дает значение true, если достигнут конец файла, false – в противном случае.
Процедура Truncate используется для отсечения от файла элементов, начиная с текущей позиции указателя включительно.
Truncate (файловая переменная);
Команды:
{$I-} отключение автоматического контроля за правильностью открытия файла и возможность приостановить работу программы после открытия файла;
{$I+} включение автоматического контроля за правильностью открытия файла, при неправильном открытии файла происходит аварийное завершение программы.
IOResult – функция, дающая некоторое целое число, анализируя которое, можно оценить, удачно или неудачно прошла процедура открытия файла. Если функция равна 0, то файл открылся нормально.
Assign (f, ‘file.dat’);
{$i-}
Reset(f);
l := IOResult;
{$i+}
if l <> 0 then ReWrite (f);
Пример 1. Сформировать файл f, компоненты которого являются целыми числами. Переписать в файл h кратные 5, а в файл g не кратные 5 элементы.
Var
h,g,f: file of integer;
a,i: integer;
Begin
Assign(f,’fff.dan’);
ReWrite(f);
a := 1;
while a <> 0 do
begin
Write(‘Введите число, конец ввода – 0’);
if a <> 0 then
Write (f,a);
end;
Seek(f,0);
Assign(h,’hhh.dan’);
ReWrite(h);
Assign(g,’ggg.dan’);
ReWrite(g);
for i:=1 to filesize(f) do
Begin
Read(f,a);
if a mod 5 =0 then
Write(h,a)
Else
Write(g,a);
end;
Write(‘Файл f’);
Seek(f,0);
for i:= 1 to filesize(f) do
Begin
Read(f,a);
Write(a,’ ‘);
end;
WriteLn;
WriteLn(‘Файл н, кратные 5’);
Seek(h,0);
while not Eof(h) do
Begin
Read(h,a);
Write(‘a,’ ‘);
end;
WriteLn;
Seek(g,0);
WriteLn(‘Файл g, не кратные 5);
while not Eof(g) do
Begin
Read(g,a);
Write(a,’ ‘);
end;
WriteLn;
Close(f);
Close(g);
Close(h);
ReadLn;
End.
Пример 2. Написать программу формирования и вывода содержимого файла на экран в виде таблицы. Каждая запись файла имеет поле: номер зачетки, ФИО, стипендия. Предусмотреть возможность добавления записей в файл, если он существует и первоначального ввода, если файла нет. Режимы работы вывести на экран в виде меню:
Меню
1. Ввод
2. Вывод
3. Выход
Список студентов
Номер зачетки | ФИО | Стипендия |
13 поз. | 20 поз. | 9 поз. |
Ширина таблицы 46 позиций (13+20+9+4 позиции для разделителей).
uses Crt; { использование модуля Crt, доступ к
экрану в текстовом режиме }
Type
stud = record
nz: string[10];
fio: string[20];
stip: real;
End;
Var
f: file of stud;
a: stud; n, k : integer;
t:real;
Begin
Assign (f, ‘st.rez’);
{$i-}
Reset(f);
k := IOResult;
{$i+}
if k <> 0 then
ReWrite (f);
n:=0;
{Номер режима работы}
while n<=2 do
begin
{Очистка экрана}
ClrScr;
{x – позиция в строке, y – строка}
GotoXY (30, 10);
WriteLn (‘Меню’);
GotoXY (20, 14);
WriteLn (‘1. Ввод’);
GotoXY (20, 16);
WriteLn (‘2. Вывод’);
GotoXY (20, 18);
WriteLn (‘3. Выход’);
GotoXY (15, 20);
Write (‘Введите номер режима работы =>’);
ReadLn (n);
ClrScr;
case n of
1: begin
if k=0 then
Seek (f, FileSize(f));
a.nz:=’1’;
while a.nz<>’0’ do
Begin
Write(‘Введите номер зачетки или 0, если
конец ввода =>’);
ReadLn(a.nz);
if a.nz <> ‘0’ then
Begin
Write (‘ФИО=>’);
ReadLn (a.fio);
Write (‘Стипендия=>’);
ReadLn (a.stip);
Write (f,a);
End;
End;
Reset(f);
k:=0;
end;
2: begin
if k<>0 then
Begin
writeln (‘файл пуст’);
readln;
end;
if k =0 then
Begin
Seek (f, 0);
WriteLn (‘ Список студентов’);
WriteLn(‘_________________________ ____________________’);
WriteLn (‘| номер зачетки | фио |
стипендия |’);
WriteLn(‘_________________________
____________________’);
t:=0;
while not Eof (f) do
Begin
Read (f,a);
WriteLn (‘| ‘, a.nz:10, ‘ |’, a.fio:20, ‘| ’,
a.stip:6:2, ‘ |’);
t:=t+a.stip;
end;
WriteLn(‘_________________________
____________________’);
WriteLn(‘| итого |’,t:8:2,’ |’);
WriteLn(‘_________________________
____________________’);
ReadLn;
end;
end;
3: Close (f);
end; {Конец case}
end; {Конец while-меню}
ClrScr;
end.
Дата добавления: 2017-01-29; просмотров: 670;