Главная страница

программирование на паскале2. Учебное пособие по курсу Высокоуровневые методы информатики и программирования для студентов Гуманитарноприкладного института


Скачать 0.89 Mb.
НазваниеУчебное пособие по курсу Высокоуровневые методы информатики и программирования для студентов Гуманитарноприкладного института
Анкорпрограммирование на паскале2.doc
Дата25.05.2018
Размер0.89 Mb.
Формат файлаdoc
Имя файлапрограммирование на паскале2.doc
ТипУчебное пособие
#19648
страница7 из 10
1   2   3   4   5   6   7   8   9   10

3.3. Файлы

3.3.1. Общие понятия


Термин файл используется в программировании в двух смыслах. В рамках операционной системы файл понимается как область памяти внешнего запоминающего устройства (обычно диска), имеющая имя. В алгоритмических языках файл - это тип данных, используемый, как правило, при работе с внешними запоминающими устройствами. В этой главе мы будем рассматривать файл как тип данных.

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

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

Условно устройство с последовательным доступом можно представить как бесконечную ленту с фиксированным началом. Движение по этой ленте возможно только от начала, последовательно от компоненты к компоненте. Для достижения N-й компоненты необходимо пройти (N-1) предыдущих компонент. В оперативной памяти ЭВМ для каждого файла существует единственная ячейка, в которую информация может считываться из файла или из которой информация может записываться в файл; эта ячейка рассчитана точно на одну компоненту файла; она называется буфером ( или окном, карманом). Используется также термин указатель файла. Это абстрактное понятие, соответствующее головке считывания-записи магнитной ленты или магнитного диска. Указатель стоит (указывает) на доступной ( в каждый момент единственной!) компоненте файла.

Обычно в алгоритмических языках определяется программное и физическое имя файлов. Программное имя - это имя переменной файлового типа, физическое имя - это имя устройства или файла на диске. Существуют специальные операторы, связывающие программное и физическое имя файла.

Файлы бывают текстовыми и двоичными.

Текстовые файлы хранят информацию во внешнем представлении. Они имеют два основных признака: во-первых, их компонентами являются строки символов; во-вторых, эта символьная информация интерпретируется в соответствии с типом вводимых или выводимых переменных. Эти файлы являются обобщением данных на устройстве CON (т.е. вводимых с клавиатуры или выводимых на экран компьютера). Умение работать с текстовыми файлами необходимо даже начинающим программистам, так как на устройстве CON данные существуют малый промежуток времени, а обычно имеется потребность в их длительном хранении.

Текстовые файлы можно подготовить, прочитать, исправить с помощью текстового редактора. Они хранят информацию во внеш­нем представлении, в виде, понятном для человека. Такие файлы часто называются видимыми.

Двоичный файл - это последовательность байтов; обмен информации между двоичным файлом и переменными программы происходит без преобразования. В Турбо Паскале рассматривается два вида двоичных файлов: типизированные и нетипизированные. В случае типизированных файлов байты файла разбиваются на ячейки в соответствии с типом компонент файла; например, для файла с базовым типом integer каждая пара байтов (для 32-разрядных компьютеров – четверка) рассматривается как целое значение; типизированные файлы хранят данные во внутреннем представлении. Для нетипизированных файлов представление информации безразлично, файл рассматривается как последовательность нулей и единиц.

Ниже рассматривается подход к файлам версии Турбо Паскаль. Объектный Паскаль поддерживает этот подход, хотя имеет и другие широкие возможности для работы с файлами, характерные для операционной среды Windows; рассмотрение последних возможностей выходит за рамки данного пособия.

3.3.2. Файлы в Турбо Паскале


Файлы бывают текстовые, типизированные и нетипизированные.

Функция EOF20(имя_файла) применяется к файлам любого вида. Она возвращает значение TRUE при чтении конца файла, иначе возвращает FALSE.

Все процедуры, использующие файлы, не работают без других, подготовительных, процедур: ASSIGN21, RESET, REWRITE.

Процедура ASSIGN связывает программное имя файла (т.е. имя переменной, описанной как файл) и его физическое имя (т.е. имя файла на диске или имя устройства, записанное по правилам операционной системы). Обращение к процедуре имеет вид:

ASSIGN(програм_имя_файла, физич_имя_файла).

Процедура RESET(имя файла) подготавливает файл к чтению (вводу). В случае отсутствия файла с заданным физическим именем процедура выводит сообщение об ошибке. В случае существования файла производятся следующие действия. Если файл не пустой, то указатель устанавливается на первую компоненту, значение первой компоненты пересылается в буфер, функция EOF принимает значение FALSE. Если файл пуст, то содержимое буфера считается неопределенным, а функция EOF устанавливается в значение TRUE.

Процедура REWRITE(имя_файла) подготавливает файл к записи (выводу). Если файл с заданным физическим именем не существует, то делается попытка создать файл. Далее файл очищается; указатель устанавливается на первую компоненту; функция EOF принимает значение TRUE.

RESET и REWRITE называются процедурами открытия файла (для чтения и записи, соответственно). Процедура APPEND(имя_файла) открывает текстовый файл для дополнения.

После окончания работы с файлом необходимо его закрыть с помощью процедуры CLOSE22 (имя_ файла). Под закрытием файла понимается его сохранение и перерегистрация в каталоге. Кроме того, в результате закрытия файла разрушается связь между программным и физическим именами файла, определенная оператором ASSIGN; использование программного имени файла становится невозможным (до повторного применения ASSIGN и открытия файла).

3.3.3. Текстовые файлы


Для описания переменной типа текстовый файл используется ключевое слово TEXT23:

VAR имя_текст-файла: TEXT; . . .

Процедуры считывания из текстового файла (записи в него) отличаются от привычных процедур ввода с клавиатуры ( вывода на экран) только тем, что в скобках перед списком ввода (вывода) указывается имя файла:

READ(имя-файла, список_ввода);

WRITE(имя_файла, список_вывода)

READLN(имя_файла, список_ввода);

WRITELN(имя_файла, список_вывода)

Если имя файла отсутствует, то используется имя CON.

Функция EOLN24(имя_файла) применима только к текстовым файлам (так же, как и процедуры READLN и WRITELN); она возвращает значение TRUE, если считан конец строки, иначе возвращает значение FALSE.

Далее приведены программы, исходные и выходные данные которых хранятся в текстовых файлах.

Пример 1

program Primer1_3_3_3;

{В текстовом файле Х хранятся сведения об игрушках}

{в текстовый файл Y записываются сведения}

{о конструкторах для детей до 7 лет}

Type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

Var x,y:text; toy:sved;

Begin

Assign (x,'d:\student\xtext.txt');

Assign(y,'d:\student\ytext.txt');

{физические имена файлов выбраны произвольно}

reset(x); rewrite(y);{x открывается для чтения, у - для записи}

if eof(x) then writeln('x - пустой')

else

Begin

while not eof(x) do

with toy do

Begin

readln(x,name); {запись считывается по полям}

readln(x,minage,maxage,rub);

if((pos('конструктор',name)>0) or pos('конструктор',name)>0))

and (maxage<=7) then

writeln(y,name); {запись выводится по полям}

writeln(y,minage,maxage, rub:8:0);

End;

End;

Close(x); Close(y);

End.

Пример 2

Program Primer2_3_3_3;

{Сведения о багаже авиапассажира состоят из фамилии, имени, отчества, количества вещей, общего веса багажа и признака наличия фотоаппаратуры. Сведения хранятся в текстовом файле. Вывести в другой текстовый файл фамилии, имена, отчества пассажиров, имеющих фотоаппаратуру. Кроме того, вывести на экран число пассажиров, вес багажа которых превышает 20 кг, и число пассажиров, у которых средний вес одной вещи больше 15 кг.}

Type Bagpas=Record {тип Bagpas - это запись, содержащая сведения о багаже одного пассажира}

Fio:String; {ФИО пассажира}

Kv: integer; {количество вещей пассажира}

P:Real; {вес багажа}

Foto:integer; {Foto=1, если фотоапаратура есть;

Foto=0, в противном случае}

End;

Var Pas:Bagpas; {cведения о багаже одного пассажира}

NameF:array [1..20] of string;

{массив ФИО пассажиров, имеющих фото}

Nf:integer; {число пассажиров, имеющих фото}

N20:integer;{число пассажиров, вес багажа которых больше 20 кг}

N15:Integer;

{число пассажиров, у которых средний вес вещи больше 15 кг}

i:Integer; { счетчик пассажиров}

F,G:text;

Begin

Assign(F,'d:\student\bag');

Reset(F);

Assign(G,'d:\student\fotores');

Rewrite(G);

If eof (F) then

Writeln (' Пуст файл исходных данных')

Else

Begin

Nf:=0; N20:=0;N15:=0;

While not eof(F) do

With pas do

Begin

Readln(F,Fio);

Readln(F,Kv);

Readln(F, P);

Readln(F,Foto);

If Foto=1 then

Begin

Nf:=Nf+1;

Writeln(G,Fio);

End;

If P>20 Then N20:= N20+1;

If P/Kv>15 Then N15:=N15+1;

End;

If Nf=0 Then Writeln(' Пассажиров с фотоаппаратурой нет')

Else

Begin

Writeln(

' Фамилии пассажиров с фотоаппаратурой в файле foto');

End;

Writeln(' Багаж больше 20 кг у',N20:3,' пассажиров');

Writeln(' Cредний вес одной вещи больше 15 кг у', N15:3,' пассажиров');

End;

Close(F);

Close(G);

End.

Замечание. Текстовые файлы можно ввести в ЭВМ, прочитать, исправить с помощью текстового редактора.

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


Описание типизированного файла:

VAR Имя Файла: FILE OF Базовый Тип; . . .

Базовый тип - любой, но не файл.

Процедуры чтения из файла и записи в файл:

READ (Имя Файла, Список Переменных)

WRITE(Имя Файла, Список Переменных)

Cписок переменных содержит переменные только базового типа.

Операторы READLN и WRITELN не имеют смысла, так как компоненты файла не являются строками.

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

Пример 1. Рассматриваются данные об игрушках из примеров §§3.1.3, 3.2, 3.3.3. Приведенные три программы должны работать последовательно друг за другом.

program texttyp {пpеобpазование текст.файла в типизиpованный};

type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

var xtext:text; x:file of sved; toy:sved;

Begin Assign(xtext,'G:\valia\xtext'); Assign(x,'G:\valia\x');

{xtext готовится в текстовом редакторе, х получается программно}

reset(xtext);rewrite(x);

if eof(xtext) then writeln(' Исходный текстовый файл пуст')

else

Begin

while not eof(xtext) do

Begin

with toy do

Begin

readln(xtext,name);

readln(xtext,minage,maxage,rub);

End;

write(x,toy);

End;

End;

Close(x); Close(xtext);

End.

program TypFile;

{из типизированного файла х в типизиpован. файл y записываются }

{ сведения о констpуктоpах для детей до семи лет}

Type sved=record

name:string;

minage,maxage:integer;rub:real;

end;

Var x,y:file of sved; toy:sved;

Begin

Assign (x,'g:\valia\x');

Assign(y,'g:\valia\y');

reset(x); rewrite(y);

if eof(x) then writeln('x - пустой файл')

else

Begin

while not eof(x) do

Begin read(x,toy);{считывается запись полностью}

with toy do

if ((pos('констpуктоp',name)>0) or

(pos('Констpуктоp',name)>0))

and (maxage<=7) then

write(y,toy);

End;

End;

Close(x); Close(y);

End.

program typtext; { перевод типизированного файла в текстовый}

type sved=record

name:string;

minage,maxage:integer;rub:real;

End;

Var y:file of sved; ytext:text; toy:sved;

Begin Assign(y,'G:\valia\y'); Assign(ytext,'G:\valia\ytext');

reset(y);rewrite(ytext);

if eof(y) then writeln(' типизированный файл пуст')

else

Begin

while not eof(y) do

Begin

read(y,toy);

With toy do

Begin

writeln(ytext,name);

writeln(ytext,minage,maxage,rub:7:0);

End;

End;

End;

Close(y); Close(ytext);

End.

Замечание. В типизированном файле все компоненты занимают одинаковое количество байтов памяти, поэтому можно определить адрес начального байта каждой компоненты по её номеру. Подпрограммы, использующие эту возможность, называются подпрограммами прямого доступа. Они приведены ниже.

Функция FILESIZE(ИмяФайла) возвращает число компонент файла.

Функция FILEPOS(ИмяФайла) возвращает номер компоненты, которая будет обрабатываться следующей процедурой ввода-вывода.

Процедура SEEK(ИмяФайла, №компоненты) смещает указатель к требуемой компоненте.

Компоненты файла нумеруются с нуля. Следовательно, оператор SEEK(ИмяФайла,FILESIZE(ИмяФайла)) переместит указатель к концу файла.

В типизированный файл, открытый для чтения, допустимо производить запись.

Пример 2. Приведенная ниже программа заменяет в типизированном файле целых чисел нулевые значения на значение a, задаваемое вводом. Для подготовки типизированного файла и его просмотра требуется написать программы, аналогичные TextTyp и TypText примера 1.

program Project1;

Var F:file of integer; a,b:integer;

begin

AssignFile(f, 'ftyp');{файл ftyp поготовлен с помощью}

Reset(F); {специальной программы}

If eof (F) then

writeln (' File is empty')

else

Begin

writeln('Input a');

readln(a);

while not eof(F) do

begin

read(F,b);

if b=0 then

begin

seek(F,filepos(F)-1);{возврат к компоненте, равной 0}

write(F, a){замена нулевого значения на а}

end

end;

CloseFile(F); writeln('end');

End; Readln

end.

Совет: не стоит использовать процедуры прямого доступа при последовательной записи или последовательном считывании компонент, это увеличит время работы программы.

3.3.5. Нетипизированные файлы


Описание нетипизированного файла:

VAR ИмяФайла: FILE;

Содержимое нетипизированного файла рассматривается системой программирования как последовательность байтов. Нетипизированный файл может содержать данные в любом представлении (внешнем, внутреннем). Ответственность за правильное использование данных несет программист. Нетипизированные файлы дают возможность организовать высокоскоростной обмен информацией.

Процедуры открытия нетипизированного файла:

RESET(ИмяФайла, РазмерЗаписиВбайтах) – для чтения,

REWRITE(ИмяФайла, РазмерЗаписиВбайтах) – для записи.

Запись – это минимальное количество передаваемых за одно обращение к устройству байтов. Размер записи по правилу умолчания равен 128. За одно обращение к устройству передается блок из N записей. Высокоскоростная передача данных получается, когда размер блока равен кластеру. Кластер – количество байтов, считываемых за один поворот диска. Типичный размер кластера – 512 или 1024.

Процедуры чтения и записи для нетипизированного файла:

BLOCKREAD(ИмяФайла, Буфер, N, NN)

BLOCKWRITE(ИмяФайла, Буфер, N, NN),

где буфер - переменная для считывания (записи) информации, NN - число считанных записей (NN<=N, строгое неравенство возможно для последнего блока).

Пример.Процедура копирования файлов произвольного типа.

Procedure Kopir(infile,outfile:string);

Var f1,f2:file; Buf:array[1..Klaster] of Byte; i:word;

{Klaster - глобальная константа, размер кластера}

Begin assign(f1,infile); assign(f2,outfile); reset(f1,1); rewrite(f2,1);

repeat

BlockRead(f1,Buffer, Klaster,i);

BlockWrite(f2,Buffer, Klaster,i)

until eof(f1);

close(f1); close(f2);

End.
1   2   3   4   5   6   7   8   9   10


написать администратору сайта