Сравнение текстовых и типизированных файлов
Текстовые файлы | Типизированные файлы |
1. Подготовка файла для записи в конец файла | |
Append(F) //Открыть файл на дописывание | Seek(F,FileSize(F)) //Установить файловый указатель на конец файла |
2. Выдача последних k строк (компонентов) | |
var F:text; name,s:string; i,k,n: integer; begin write('Имя файла:'); readln(name); Assign(F, name); Reset(F); write(’Сколько строк выдать?'); readln(k); n:=0; //Подсчет числа n строк в файле while not Eof(F) do begin readln(F, s); n:=n+1 end; Reset(F); if (n>k) then //Если строк больше, чем запрошено for i:=1 to n-k do //то проброс n-k строк readln(F, s); //из начала файла while not Eof(F) do //Вывод строк на экран begin readln(F, s); writeln(s) end; Close(F) end. | var F:file of integer; name:string; x,k,n: integer; begin write('Имя файла:'); readln(name); Assign(F, name); Reset(F); write('Сколько чисел выдать?'); readln(k); n:=FileSize(F); //Определение числа компонентов if (n>k) then //Если чисел больше, чем запрошено Seek (F,n-k); //то установка файлового указателя //на k-е число от конца while not Eof(F) do //Вывод чисел на экран begin read(F,x); write(x, ’ ’) end; Close(F) end. |
3. Замена строки (компонента) с заданным номером | |
Открываем новый временный файл Ft с именем, полученным добавлением символов ’tmp’ к имени исходного файла. Копируем строки из файла F в файл Ft, считая строки. Если номер строки равен k, вместо строки исходного файла пишем новую строку. Оба файла закрываем, исходный файл удаляем, а временный файл переименовываем в исходный. var F,Ft:text; name,s,snew:string; i,k: integer; begin write(’Имя файла:’); readln(name); Assign(F, name); Reset(F); write(’Какую строку заменить?’); readln(k); //Номер заменяемой строки write(’Новая строка:’); readln(snew); Assign(Ft, ’tmp’+name); Rewrite(Ft); i:=0; //Счетчик строк while not Eof(F) do begin readln(F,s); i:=i+1; if i=k tnen writeln(Ft,snew) else writeln(Ft,s) end; Close(F); Close(Ft); Erase(F); Rename(F,name) End. | var F:file of integer; name:string; k,xnew: integer; begin write(’Имя файла:’); readln(name); Assign(F, name); Reset(F); write(’Число с каким номером заменить?’); readln(k); //Номер числа write(’Новое число:’); readln(xnew); Seek(F,k); Write(F,xnew); Close(F) End. |
Пример работы с типизированными файлами из записей
Создать файл из записей, где первое поле – фамилия, второе поле – год окончания мехмата. Исходные данные ввести с клавиатуры, признаком окончания ввода служит строка '---' при вводе фамилии.
Найти выпускника, ранее всех закончившего мехмат.
Переписать в новый файл такого же типа записи о выпускниках заданного года. Выдать оба файла на экран.
Program File_Rec;
type stud=record
FIO:string[15];
year:word
end;
Fstud= file of stud;
var F1,F2: Fstud; //Файлы из записей
name1, name2: string[10];
Y: word; //Заданный год окончания
const tabs= #9#9; //Табуляция для вывода на экран
procedure Creat_F(var F:Fstud);
var s: stud;
begin
repeat
write(’FIO или ---:’); readln(s.FIO);
if s.FIO = ’---’ then break;
write(’year:’);
readln(s.year);
write(F, s)
until false;
end;
procedure Print_F(var F:Fstud);
var s: stud;
begin
while not Eof(F) do
begin
read(F, s);
writeln(s.FIO, tabs, s.year)
end
end;
procedure Min_Year(var F:Fstud);
var s, min: stud; //Запись min для выпускника с минимальным годом выпуска
begin
min.FIO:=''; //Начальные значения
min.year:=Maxint; //перед циклом поиска
while not Eof(F) do
begin
read(F, s); //Чтение записи
if (s.year < min.year) //Если год из записи меньше минимального года,
then min:=s //то запоминание нового минимального
end;
writeln(min.FIO, tabs, min.year) //Вывод записи с минимальным годом
end;
procedure F_F(var F1,F2:Fstud; Y:word);
var s: stud;
begin
while not Eof(F1) do
begin
read(F1, s); //Чтение записи
if (s.year=Y) //Если год из записи файла совпадает с заданным годом
then write(F2, s) //то копирование записи в файл F2
end
end;
Begin
//______ Файл выпускников ______
write('Имя файла1:'); readln(name1);
Assign(F1, name1);
Rewrite(F1);
writeln(' Ввод данных для файла выпускников:');
Creat_F(F1);
Reset(F1);
writeln(' Файл выпускников:');
Print_F(F1);
writeln(' Выпускник, ранее других окончивший мехмат');
Reset(F1);
Min_Year(F1);
//______ Файл выпускников заданного года ______
write('Имя файла2:'); readln(name2);
Assign(F2, name2);
Rewrite(F2);
write('Год выпуска:'); readln(Y);
Reset(F1);
F_F(F1,F2,Y);
writeln(' Файл выпускников ', Y, ' года:');
Reset(F2);
Print_F(F2);
Close(F1);
Close(F2);
end.
Процедурные типы