
- •§4. Файлы
- •4.1. Общие положения
- •4.2. Классификация файлов.
- •4.3. Файловый тип данных.
- •4.4. Стандартные процедуры для работы с файлами
- •4.5. Типизированные файлы
- •4.6. Текстовые файлы
- •4.7. Дополнительные процедуры и функции, используемые при работе с файлами
- •4.8. Стандартные файлы
- •Задачи для самостоятельного решения.
- •§5. Использование стандартных библиотечных модулей
- •5.1. Модуль crt
- •5.1.1. Программирование клавиатуры
- •5.1.2. Текстовый вывод на экран
- •5.2. Модуль graph
- •5.2.1. Переход в графический режим и возврат в текстовый.
- •5.2.2. Инициализация графического режима
- •5.2.3. Экран и окно в графическом режиме
- •5.2.4. Рисование линий и точек.
- •5.2.5. Рисование многоугольников
- •5.2.6. Рисование дуг, окружностей, эллипсов
- •5.2.7. Краски, палитры, заполнения
- •5.2.8 Вывод текста
- •Задачи для самостоятельного решения.
- •Литература
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.