Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
E.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
323.58 Кб
Скачать

4.5. Типизированные файлы

Все элементы типизированного файла должны быть одного типа (любого, принятого в Турбо Паскале, кроме файлового или опирающегося на файловый). Пример объявления типизированного файла рассмотрен в п.4.3.

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

Процедуры Read, Write. Чтение данных из типизированных файлов выполняется только процедурой Read, а запись - только процедурой Write. При этом единицей чтения/записи может быть только переменная того же типа, что и тип файла.

Формат вызова процедуры Read в программе:

Read (<имя файловой переменной>, <список параметров>);

Например, Read(f, x1, x2, ..., xn);

Данная процедура последовательно считывает из файла f значения, присваивая их переменным x1, x2, ..., xn , начиная чтение с компонента, на который установлен текущий указатель. Процедура Read выполняется только в случае, когда eof(f)=false. Если в процедуре Read имя файловой переменной пропущено, то имеется в виду стандартный файл Input. Тип переменных x1, x2, ..., xn должен соответствовать базовому типу элементов файла.

Вместо процедуры Read(f, x1, x2, ..., xn) можно использовать несколько последовательно выполняемых процедур: Read(f, x1); Read(f, x2); ...; Read(f, xn);

Формат вызова процедуры Write в программе:

Write (<имя файловой переменной>, <список параметров>);

Например, Write(f, a1, a2, ..., an);

Данная процедура записывает в файл f значения a1, a2, ..., an (константы или переменные того же типа, что и элементы файла) , начиная запись с той позиции, на которую установлен текущий указатель. Выполняя запись в файл, следует помнить, что при записи каждой переменной указатель текущей позиции в файле перемещается на следующий элемент. Если указатель текущей позиции файла находится за последним элементом, т.е. в конце файла eof (f)=true, то при выполнении процедуры Write файл расширяется. Если в процедуре Write имя файловой переменной пропущено, то имеется в виду стандартный файл Output.

Вместо процедуры Write(f, a1, a2, ..., an) можно использовать несколько последовательно выполняемых процедур: Write(f, a1); Write(f, a2); ...; Write(f, an);

Для организации прямого доступа к элементам файла предназначены следующие процедуры и функции.

Функции FilePos, FileSize.

Функция FilePos позволяет определить текущее положение указателя в файле, т.е. номер элемента. Следует помнить, что позиции в файле нумеруются от нуля.

Формат обращения к функции FilePos в программе:

FilePos (<имя файловой переменной>);

Например, оператор N:= FilePos(f) присваивает переменной N (типа LongInt или совместимого с ним) текущий номер элемента.

Функция FileSize позволяет определить текущий размер файла, т.е. число элементов в файле. Следует помнить, что подсчет элементов файла начинается с единицы.

Формат обращения к функции FileSize в программе:

FileSize (<имя файловой переменной>);

Например, оператор N:= FileSize(f) присваивает переменной N (типа LongInt или совместимого с ним) значение 11, если элементы в файле имели номера с нулевого по десятый.

Процедура Seek. Процедура Seek перемещает указатель текущей позиции в файле на элемент с заданным номером. Нумерация элементов ведется от нуля.

Формат вызова процедуры в программе:

Seek (<имя файловой переменной>, <порядковый номер элемента >);

Например, Seek (f, N) устанавливает указатель текущей позиции в файле f на элемент с номером N (типа LongInt или совместимого с ним).

Процедура Truncate. Процедура Truncate усекает размер файла до текущей позиции, т.е. все элементы, расположенные после текущей позиции в файле, удаляются, и текущая позиция становится концом файла eof (f)=true.

Формат вызова процедуры в программе:

Truncate (<имя файловой переменной>);

Примеры на обработку типизированных файлов.

Пример 1. Создате файл из 20 последовательных целых чисел, начиная с числа 41. Выведите файл на экран. Дайте компоненту с номером 15 новое значение 99, снова выведите файл на экран и затем его уничтожьте.

program chisla;

uses crt;

var i: integer;

f: file of integer;

begin { ----- Создание файла  ----- }

clrscr;

assign (f,'d1.txt'); rewrite (f);

writeln (' первоначальный файл: ');

for i:=41 to 60 do

begin write(f,i); write(i,' '); end;

close(f);

{ ----- Изменение файла  ----- }

reset(f); writeln; writeln(' измененный файл: ');

seek(f,15); i:=99; write(f,i);

seek(f,0);

while not eof(f) do

begin read(f, i); write(i,' ') end;

readln; {задержка экрана}

close(f); erase(f)

end.

В результате исполнения программы получим:

первоначальный файл:

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60

измененный файл:

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 99 57 58 59 60

Пример 2. Создать файл, состоящий из неопределенного количества cлучайных чисел, лежащих в диапазоне 0 ... 100. Для выхода из цикла используйте значение 99. Прочитайте файл и определите, есть ли в нем некоторое заданное число. Вывести содержимое файла и количество его элементов на экран.

program fgh; {------ Нахождение элемента в файле ------}

uses crt;

label 1;

var f:file of integer;

i,z,y,k:integer; d:char;

begin clrscr;

writeln('Вы желаете создать свой файл - нажмите клавишу Y');

writeln(' или работать с ранее созданным – S’);

readln(d);

if (d='s') or (d='S') then goto 1 else

begin

assign(f,'c:ref.pas'); rewrite(f);

Randomize; {инициирует генератор случайных чисел}

repeat y:=Random(100); write(f,y) until y=99;

close(f)

end;

1: assign(f,'c:ref.pas'); reset(f);

write('Введите число для поиска: ');

readln(z); k:=0;

{ Вывод содержимого файла на экран и поиск заданного числа }

while not eof(f) do

begin read(f,y); Write(y:4); if y=z then k:=k+1 end;

Writeln; i:=Filesize(f);

if k>0 then

writeln('Заданное значение ',z,' присутствует в файле ',k,'раз.')

else write('Заданное значение ',z,' в файле отсутствует.');

close(f);

Writeln('файл содержит ‘,i,' элементов’)

end.

Пример 3. Дан файл f , элементами которого являются символы. Переписать содержимое файла f в файл g в обратном порядке.

program perezap;

uses crt;

var i,n:integer; x,y:char;

f,g:file of char;

begin { ----- Создание файла f -----}

clrscr;

assign(f,'c:\bp\bin\perv.doc'); rewrite(f);

write('количество элементов:'); readln(n);

writeln('введите элементы:');

for i:=1 to n do

begin readln(x); write(f,x) end;

close(f);

{ ----- Создание файла g -----}

assign(g,'c:\bp\bin\wtor.doc'); rewrite(g);

reset(f);

for i:=1 to n do

begin seek(f,n-i); read(f,x); write(g,x) end;

close(f); close(g);

{ ------ Вывод элементов файлов f и g на экран -----}

clrscr;

writeln('файл f: файл g:');

reset(f); reset(g);

for i:=1 to n do

begin read(f,x); read(g,y); writeln(x,' ',y) end;

close(f); close(g);

readln { задержка экрана }

end.

Пример 4. Даны два файла A и B. Элементами файла А являются целые числа, а файла B - символы. Вывести на экран все числа из первого файла, и рядом с каждым числом элемент из второго файла с соответствующим номером. Если во втором файле отсутствует элемент с данным номером, то вывести соответствующее сообщение (например, символ '-').

program wwod;

uses crt;

var x,i,j,l,k:integer; y:char;

a:file of integer; b:file of char;

begin { ----- Создание файлов ----- }

clrscr;

assign(a,'c:\integ.doc'); rewrite(a);

writeln('выход - 1111.');

writeln('введите элементы файла А:');

readln(x); i:=0;

while x<>1111 do

begin i:=i+1; write(a,x); readln(x) end;

close(a);

clrscr;

assign(b,'c:\char.doc'); rewrite(b);

writeln('выход - w.');

writeln('введите элементы файла B:');

readln(y); j:=0;

while y<>'w' do

begin j:=j+1; write(b,y); readln(y) end;

close(b);

{ ----- вывод файлов на экран ----- }

clrscr;

if j>i then l:=j else l:=i;

writeln(' файл А: файл В:');

reset(a); reset(b);

for k:=1 to l do

begin

if k>i then x:=0 else read(a,x);

if k>j then y:='-' else read(b,y);

if x=0 then writeln('-':6,' ',y) else writeln(x:6,' ',y)

end;

close(a); close(b);

readln

end.

Пример 5. Дан файл D, содержащий даты. Каждая дата – это число, месяц год. Найти и записать в файл D1 даты, содержащие год с наименьшим номером, и среди них выбрать самую позднюю дату, а в файл D2 – все весенние даты.

program data;

uses crt;

type zap=record

ch:1..31; m:1..12; g:integer;

end;

var i,l,n:integer; s:0..12; r:0..31; x,y:zap;

D,D1,D2:file of zap;

{ ----- Создание файла ----- }

begin clrscr;

assign(d,'c:\bp\bin\data.txt'); rewrite(d);

write('сколько дат внести?:');

readln(n);

for i:=1 to n do

begin write('введите число:'); readln(x.ch);

write('месяц:'); readln(x.m);

write('год:'); readln(x.g); write(d,x)

end;

close(d);

{ ----- Нахождение весенних дат ----- }

assign(d2,'c:\bp\bin\wesna.txt'); rewrite(d2); reset(d);

i:=0; writeln; writeln('весенние даты:');

while not eof(d) do

begin read(d,x);

if (x.m>02) and (x.m<06) then

begin i:=2; write(d2,x);

writeln(x.ch,'/',x.m,'/',x.g)

end

end;

close(d); close(d2);

{ ----- Поиск даты ----- }

assign(d1,'c:\bp\bin\poisk.txt'); rewrite(d1); reset(d);

l:=9999; s:=0; r:=0;

while not eof(d) do

begin read(d,x); if x.g<l then

begin l:=x.g; if x.m>s then

begin s:=x.m; r:=x.ch end

end;

x.ch:=r; x.m:=s; x.g:=l; write(d1,x)

end;

close(d); close(d1); writeln;

reset(d1);

read(d1,x); writeln('файл D1:'); writeln(x.ch,'/',x.m,'/',x.g);

close(d1);

readln

end.

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

program admin;

uses crt; label 1,2,3,4,5,6;

type zap=record

dw,wo:string[10];

nr,km,pm:integer;

pn:string[20];

end;

var x:char; i:integer; l:string[25];

a,b:zap; f:file of zap;

begin {----- Меню -----}

1: clrscr;

writeln(' ':5, 'создать файл - Ф,');

writeln(' ':5, 'добавить в файл - Д,');

writeln(' ':5, 'вывести список - C,');

writeln(' ':5, 'корректировка списка ( время, число мест) - К,');

writeln(' ':5, 'информация о местах - И,');

writeln(' ':5, 'выход - В.');

readln(x);

assign(f,'c:\admin.doc');

case x of

'Д': goto 2;

'Ф': goto 2;

'С': goto 4;

'К': goto 4;

'И': goto 5;

'В': goto 6;

end;

{ ----- Создание файла данных----- }

2: clrscr;

if x='Ф' then begin

write('Удалить информацию из файла? (д/н) :');

readln(x); if x<>'д' then goto 1;

rewrite(f);

end

else begin reset(f);

while not eof(f) do

read(f,a);

end;

{ ----- Запись файла ----- }

3: clrscr;

write('введите: дату выезда:'); readln(a.dw);

write('номер поезда:'); readln(a.nr);

write('конечный пункт назначения:'); readln(a.pn);

write('время отправления:'); readln(a.wo);

write('число свободных купейных мест:'); readln(a.km);

write('число свободных плацкартных мест:'); readln(a.pm);

write(f,a);

write('Вы хотите ввести еще данные-(д/н) :');

readln(x);

if x='д' then goto 3;

close(f);

goto 1;

{ ----- Вывод списка на экран ----- }

4: clrscr; reset(f);

writeln('дата выезда-номер поезда-пункт назначения-время отправления-куп.мест-плацк.мест');

while not eof(f) do

begin read(f,a);

writeln(a.dw:11,a.nr:12,a.pn:17,a.wo:18,a.km:9,a.pm:11);

end;

close(f); if x='С' then begin readln; goto 1 end;

{ ----- Корректировка списка ----- }

write('введите дату выезда:'); readln(b.dw);

write('номер поезда:'); readln(b.nr);

write('конечный пункт назначения:'); readln(b.pn);

reset(f); i:=0;

while not eof(f) do

begin read(f,a); i:=i+1;

if (a.dw=b.dw) and (a.nr=b.nr) and (a.pn=b.pn) then

begin

write('время отправления:'); readln(a.wo);

write('число свободных купейных мест:');

readln(a, km);

write('число свободных плацкартных мест:');

readln(a.pm);

seek(f,i-1); write(f,a);

writeln(a.dw,' - ',a.nr,' - ',a.pn,' - ',a.wo,' - ',a.km,' - ',a.pm);

end

end;

close(f); readln; goto 1;

{ ----- Информация о местах ----- }

5: clrscr;

write('введите дату выезда:'); readln(b.dw);

write('номер рейса:'); readln(b.nr);

write('конечный пункт назначения:'); readln(b.pn);

write('время отправления:'); readln(b.wo);

reset(f); i:=0;

while not eof(f) do

begin read(f,a);

if (a.dw=b.dw) and (a.nr=b.nr) and (a.pn=b.pn) and (a.wo=b.wo) then

begin

writeln('свободно купейных мест-',a.km);

writeln('свободно плацкартных мест-',a.pm);

i:=2;

end

end;

if i<>2 then writeln('нет информация на данный рейс');

readln; close(f); goto 1;

6: end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]