Организация данных в ЭВМ и основы программирования (1017140), страница 15
Текст из файла (страница 15)
end.
Протокол работы программы:
Иванов 1966
Петров 1970
Сидоров 1972
Пушкин 1968
1 – ая запись
2 – ая запись
и т. д.
Пример. В программе из внешнего файла с именем PP75.dat удаляются все записи, соответствующие людям, родившимся до 1970 года. Для этого используется рабочий файл с внешним именем `PPR.dat`, в который сначала последовательно переписываются из внешнего файла все оставляемые записи, затем внешний файл открывается на запись, рабочий файл – на чтение и всё содержимое рабочего файла переписывается во внешний файл. При этом для контроля работы программы оставляемые записи выдаются на терминал.
Program PP75;
Type ZAP = Record
FIO : Array [1…10] of Char;
GOD: integer
end; {of record}
F = File;
Var FIZAP, RB: FPK;
A : ZAP;
I : integer;
{Ввод данных в файл FIZAP}
begin Assign (FIZAP, `C: \ t – pas \ pp75.dat);
ReWrite (FIZAP, 12);
Repeat
Write (`=>`);
For I = 1 to 10 do
read (A. FIO [I]);
Readln (A. God);
BlockWrite (FIZAP, A, 1)
Until A . FIO = `**********`; {здесь год должен быть >1970}
close (FIZAP);
{контрольный вывод содержимого обрабатываемого файла FIZAP}
Writeln;
Writeln (`обрабатываемый файл :`);
Reset (FIZAP, 12);
I: = 1;
Repeat BlockRead (FIZAP, A, 1);
Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);
I : = I+1
Until A . FIO = `**********`;
close (FIZAP);
{Перепись из обработанного файла FIZAP в рабочий файл RB людей, родившихся не ранее 1970 года}
Reset (FIZAP, 12);
Assign (RB, `C: \ Language\ t – pas \ pp75.dat);
ReWrite (RB, 12);
Repeat
BlockRead (FIZAP, A, 1);
If A . GOD >= 1970 Chen BlockWrite (RB, A, 1)
Until A . FIO = `**********`;
close (RB);
close (FIZAP);
{ контрольный вывод содержимого обрабатываемого файла RB}
Writeln;
Writeln (`рабочий файл :`);
Reset (RB, 12);
I: = 1;
Repeat BlockRead (RB, A, 1);
Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);
I : = I+1
Until A . FIO = `**********`;
close (RB);
{Перепись из рабочего файла RB в обрабатываемый файл FIZAP}
Reset (RB, 12);
ReWrite (FIZAP, 12);
Repeat
BlockRead (RB, A, 1);
BlockWrite (FIZAP, A, 1)
Until A . F1O = `**********`;
close (RB);
close (FIZAP);
{ контрольный вывод содержимого обрабатываемого файла}
Writeln;
Writeln (`обработанный файл :`);
Reset (FIZAP, 12);
I: = 1;
Repeat BlockRead (FIZAP, A, 1);
Writeln (I : 2, `-ая запись `, A. FIO, A. GOD: 5);
I : = I+1
Until A . FIO = `**********`;
close (FIZAP);
Writeln (`ok`)
end.
Для добавления записей в конец не существующего файла необходимо воспользоваться промежуточным файлом. Сначала скопировать всё содержимое обрабатываемого файла в промежуточный файл, записать в конец добавляемые записи, затем открыть на запись обрабатываемый файл и переписать в него всё содержимое промежуточного файла.
Для добавления записей в конец существующего файла необходимо также воспользоваться промежуточным файлом. Сначала скопировать всё содержимое обрабатываемого файла в промежуточный файл, записать в конец добавляемые записи, затем открыть на запись обрабатываемый файл и переписать в него всё содержимое промежуточного файла.
Программа записи информации о товарах во внешний файл по сф-ре. может быть аналогичной программе РР74. Разница будет заключаться в названии и количестве полей каждой записи, а также в форме задания вешнего имени файла в операторе ReWrite.
Пример. Программа обеспечивает добавление во внешний упорядоченный файл одной записи. Она может быть принята за основу при разработке программы, которая добавляет во внешний упорядоченный файл М записей. Для этого достаточно повторить в цикле М раз те действия, которые производились при добавлении одной записи.
Program Z3;
Type ZAP = Record
NOV : Array [1…10] of Char;
Cena : integer
end; {of record}
Tovar = File of ZAP;
Var Nov, Star: Tovar;
B : ZAP;
I : integer;
Begin
(*ввод с терминала полей новой записи*)
Write (`=>`);
For I := 1 to 10 do
read (B. Nazv [I]);
Readln (B. Cena);
(*открытие файлов*)
Reset (Star, Star.dat);
ReWrite (Nov, Nov.dat);
(*вставка новой записи*)
While условие окончания ввода записей do
Операторы ввода записей
Close (Nov):
(*перепись данных из нового файла в старый и их печать*)
Reset (Nov, Nov.dat);
ReWrite (Star, Star.dat);
Repeat
Операторы присваивания значений записей нового файла записям старого файла.
Writeln (B. Nazv, B. Cena) (*вывод на терминал*)
Until B. Nazv = `**********`;
Close (Star)
end.
10.7. Типизированные файлы
Длина любого компонента типизированного файла строго постоянна, что даёт возможность доступа к каждому компоненту. Перед первым обращением к процедурам ввода – вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом.
Такой способ доступа называется последовательным. В Турбо – Паскале имеется также возможность организации прямого доступа к компонентам типизированного файла (процедура Seck).
Существует ряд процедур и функций для работы с типизированными файлами.
Процедура Read (файловая переменная, список ввода).
Обеспечивает чтение очередных компонентов типизированного файла.
Здесь «список ввода» - содержит одну или более переменных такого же типа, что и компоненты файла.
10.8. Текстовые файлы
10.9. Нетипизированные файлы
Program PP71;
Type ZAP=Record
FIO:Array[1..10] of Char;
God:Integer
end;
FPK=File;
Var FIZAP:FPK;
A,B:ZAP;
J,I:Integer;
Begin Assign(FIZAP,'pp71.dat');
Rewrite(FIZAP, 12);
For J:=1 to 3 do
Begin Write('=>');
For I:=1 to 10 do Read(B.FIO[I]);
Readln(B.God);
BlockWrite(FIZAP,B,1)
end;
Close(FIZAP);
Reset(FIZAP, 12);
For J:=1 to 3 do
Begin BlockRead(FIZAP,A,1);
Writeln(J:2,'-ая запись ',A.FIO,A.God:5);
end
end.
Program PP74;
Type ZAP=Record
FIO:Array[1..10] of Char;
God:Integer
end;
FPK=File;
Var FIZAP:FPK;
A:ZAP;
I:Integer;
Begin Assign(FIZAP,'pp74.dat');
Rewrite(FIZAP, 12);
Repeat
Write('=>');
For I:=1 to 10 do Read(A.FIO[I]);
Readln(A.God);
BlockWrite(FIZAP,A,1);
Until A.FIO='**********';
Close(FIZAP);
Reset(FIZAP,12);
I:=1;
Repeat
BlockRead(FIZAP,A,1);
Writeln(I:2,'-ая запись ',A.FIO,A.God:5);
I:=I+1
Until A.FIO='**********'
end.
Program PP75;
Type ZAP=Record
FIO:Array[1..10] of Char;
God:Integer
end;
FPK=File;
Var FIZAP,RB:FPK;
A:ZAP;
I:Integer;
{-------------------------------------------------------------------------}
{ВВОД ИСХОДНЫХ ДАННЫХ В ФАЙЛ FIZAP}
Begin Assign(FIZAP,'C:\program\t-pas\pp75.dat');
Rewrite(FIZAP, 12);
Repeat
Write('=>');
For I:=1 to 10 do Read(A.FIO[I]);
Readln(A.God);
BlockWrite(FIZAP,A,1);
Until A.FIO='**********';
Close(FIZAP);
{------------------------------------------------------------------------}
{КОНТРОЛЬНЫЙ ВЫВОД СОДЕРЖИМОГО ОБРАБАТЫВАЕМОГО ФАЙЛА FIZAP}
Writeln;
Writeln('Обрабатываемый файл:');
Reset(FIZAP,12);
I:=1;
Repeat
BlockRead(FIZAP,A,1);
Writeln(I:2,'-ая запись ',A.FIO,A.God:5);
I:=I+1
Until A.FIO='**********';
Close(FIZAP);
{------------------------------------------------------------------------}
{ПЕРЕПИСЬ ИЗ ОБРАБАТЫВАЕМОГО ФАЙЛА FIZAP В РАБОЧИЙ ФАЙЛ RB ЛЮДЕЙ, }
{ РОДИВШИХСЯ НЕ РАНЕЕ 1970 ГОДА }
Reset(FIZAP,12);
Assign(RB,'C:\program\t-pas\ppr75.dat');
Rewrite(RB,12);
Repeat
BlockRead(FIZAP,A,1);
If A.God>=1970 then BlockWrite(RB,A,1)
Until A.FIO='**********';
Close(RB);
Close(FIZAP);
{------------------------------------------------------------------------}
{КОНТРОЛЬНЫЙ ВЫВОД СОДЕРЖИМОГО РАБОЧЕГО ФАЙЛА RB}
Writeln;
Writeln('Рабочий файл:');
Reset(RB,12);
I:=1;
Repeat
BlockRead(RB,A,1);
Writeln(I:2,'-ая запись ',A.FIO,A.God:5);
I:=I+1
Until A.FIO='**********';
Close(RB);
{------------------------------------------------------------------------}
{ПЕРЕПИСЬ ИЗ РАБОЧЕГО ФАЙЛА RB В ОБРАБАТЫВАЕМЫЙ ФАЙЛ FIZAP}
Reset(RB,12);
Rewrite(FIZAP,12);
Repeat
BlockRead(RB,A,1);
BlockWrite(FIZAP,A,1)
Until A.FIO='**********';
Close(RB);
Close(FIZAP);
{-------------------------------------------------------------------------}
{КОНТРОЛЬНЫЙ ВЫВОД СОДЕРЖИМОГО ОБРАБАТЫВАЕМОГО ФАЙЛА FIZAP}
Writeln;
Writeln('Обработанный файл:');
Reset(FIZAP,12);
I:=1;
Repeat
BlockRead(FIZAP,A,1);
Writeln(I:2,'-ая запись ',A.FIO,A.God:5);
I:=I+1
Until A.FIO='**********';
Close(FIZAP);
{------------------------------------------------------------------------}
Writeln('ok')
end.
Program z3;
type zap=record
nazv:array[1..15] of char;
cena:real
end;
tov=file;
var nov,star:tov;
b:zap;
i:integer;
begin
{----------------------------------------------------------------------}
{ОТКРЫТИЕ ФАЙЛА STAR НА ЗАПИСЬ}
assign(star,'c:\program\t-pas\star.dat');
rewrite(star,24);
{---------------------------------------------------------------------}
{ЗАПОЛНЕНИЕ ФАЙЛА STAR УПОРЯДОЧЕННЫМИ ПО НЕУБЫВАНИЮ ЦЕН ТОВАРОВ ЗАПИСЯМИ}
writeln('НАЗВАНИЕ ТОВАРА',' ЦЕНА(руб.)');
repeat
for i:=1 to 15 do read(b.nazv[i]);
readln(b.cena);
blockwrite(star,b,1)
until b.nazv='***************';
close(star);
{-----------------------------------------------------------------------}
{КОНТРОЛЬНЫЙ ВЫВОД СОДЕРЖИМОГО ФАЙЛА star}
writeln;
writeln('Обрабатываемый файл:');
reset(star,24);
repeat
blockread(star,b,1);
writeln(b.nazv:15,' ',b.cena:6:2)
until b.nazv='***************';
close(star); end.
{-----------------------------------------------------------------------}
{ВВОД С ТЕРМИНАЛА ПОЛЕЙ НОВОЙ ЗАПИСИ}
{-----------------------------------------------------------------------}
{ВСТАВКА НОВОЙ ЗАПИСИ}
{-----------------------------------------------------------------------}
{ПЕРЕПИСЬ ДАННЫХ ИЗ НОВОГО ФАЙЛА В СТАРЫЙ И ИХ ПЕЧАТЬ}
{----------------------------------------------------------------------}
{ЗАКРЫТИЕ ФАЙЛОВ}
{------------------------------------------------------------------------}
end.
10.10. Стандартные файлы INPUT и OUTPUT
3