Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка по информатике

.pdf
Скачиваний:
182
Добавлен:
18.03.2015
Размер:
9.43 Mб
Скачать

Процедура Close(f) закрывает открытый до этого файл с файловой переменной f. Вызов процедуры Close необходим при завершении работы с файлом. Если по какой-то причине процедура Close не будет выполнена, файл все-таки будет создан на внешнем устройстве, но содержимое последнего буфера в него не будет перенесено.

Процедура EOF(f) возвращает значение TRUE, когда при чтении достигнут конец файла. Это означает, что уже прочитан последний элемент в файле или файл после открытия оказался пуст.

Процедура Rename(f, NewName) позволяет переименовать физический файл на диске, связанный с файловой переменной f. Переименование возможно после закрытия файла.

Процедура Erase(f) уничтожает физический файл на диске, который был связан с файловой переменной f. Файл к моменту вызова процедуры Erase должен быть закрыт.

3.2.2. Текстовые файлы. Текстовый файл это совокупность строк, разделенных метками конца строки. Сам файл заканчивается меткой конца файла. Доступ к каждой строке возможен лишь последовательно, начиная с первой. Одновременная запись и чтение запрещены.

Текстовый файл содержит строки текста различной длины. Каждая строка завершается символами «Возврат каретки» (код 13) и «Перевод строки» (код 10). При обычном просмотре эти символы на экране не отображаются, а интерпретируются компьютером как признак окончания одной строки и начала следующей.

Текстовый файл не эквивалентен объявлению типизированного файла с элементами типа «строка».

Объявление текстового файла выглядит следующим образом:

Var

FT: Text;

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

Assign(FT,’log.txt’);

При работе с текстовым файлом разрешается либо чтение, либо запись. Открытие файла для чтения или записи выполняется

110

процедурами ReSet или ReWrite. Для текстовых файлов, помимо процедур ReSet/ReWrite, определена еще одна процедура открытия:

Append(F);

Данная процедура открывает файл для записи, при этом новые данные добавляются в конец файла, прежнее содержимое файла сохраняется (в отличие от процедуры ReWrite).

Далее в зависимости от способа открытия файла можно либо читать из него данные, применив операторы

Read(FT, i,j), ReadLn(FT, s),

либо записывать в него данные, применяя операторы

Write(FT, a,b,c), WriteLn(FT, Result).

При чтении/записи данных применяются те же правила, что и при вводе/выводе с клавиатуры/на экран, т.е. можно использовать форматирование:

WriteLn(F, x:5:2, y:10:3).

Процедуры считывают информацию из файла f и записывают соответственно в указанные переменные. Способ чтения зависит от типа переменных, стоящих в списке. В переменную char помещаются символы из файла. В числовую переменную: пропускаются символыразделители, начальные пробелы и считывается значение числа до появления следующего разделителя. В переменную типа string помещается количество символов, равное длине строки, но только в том случае, если раньше не встретились символы конца строки или конца файла. Отличие опрератора ReadLn от Read в том, что в случае применения оператора ReadLn после прочтения данных пропускаются все оставшиеся символы в данной строке, включая метку конца строки. Если список переменных отсутствует, то процедура ReadLn(f) пропускает строку при чтении текстового файла.

Диаграмма последовательности вызываемых процедур для текстовых файлов:

111

Assign

 

ReSet

 

ReWrite

Append

Read / ReadLn

Write / WriteLn

 

Close

 

Рис. 2. Последовательность вызываемых процедур для текстовых файлов

3.2.3. Типизированные файлы. Типизированный файл – это последовательность компонент любого заданного типа (кроме типа «файл»). Доступ к компонентам файла осуществляется по их порядковым номерам. Компоненты нумеруются, начиная с 0. После открытия файла указатель (номер текущей компоненты) стоит в его начале на нулевом компоненте. После каждого чтения или записи указатель сдвигается к следующему компоненту.

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

Type

FInt = file of Integer; { файл с целыми числами } Var

F: FInt;

F2: File of Real;

FT: File of String[70]; { файл со строками }

После объявления файловой переменной для работы с файлом необходимо связать ее с реальным файлом на диске. Это выполняется процедурой Assign:

Assign(F,’c:\test\testfile.dat’);

Первый параметр – имя файловой переменной, используемой в дальнейшем для обращения к файлу. Может иметь любой файловый тип. Второй параметр – строка, указывающая на путь и имя файла, с которым Паскаль далее будет оперировать. Имя файла рекомендуется

112

задавать по правилам MS-DOS (не более 8 символов имя, не более 3 – расширение, англ. буквы).

Если файл будет считываться, он должен присутствовать на диске. Если создается новый файл, он может отсутствовать. Процедура Assign не проверяет наличие файла на диске!

Для создания нового файла на диске после выполнения процедуры Assign необходимо открыть файл в режиме записи:

ReWrite(F),

где F – это файловая переменная.

Если файл с таким именем не существовал, он создается. Если он существовал, вся информация из этого файла стирается и файл становится пустой. При этом никаких предупреждений не

выдается!

Для открытия файла в режиме чтения он должен быть открыть процедурой:

Reset(F);

После этого можно выполнять чтение или запись, используя соответствующую файловую переменную:

Read(F,i,j);

Write(F,n);

В первом примере из файла, связанного с переменной F, считывается два значения, во втором – записывается одно.

Эти операции можно выполнять многократно. Например, можно считать из открытого файла все значения и вывести их на экран:

Var

F:file of Integer; { объявление файловой переменной }

N:Integer;

Begin

Assign(F,’data.dat’); { связать F с файлом на диске} ReSet(F); { открыть файл }

While not EOF(F) do begin { пока не конец файла}

Read(F,N);

{ считать число из файла }

WriteLn(N);

{ вывести число на экран }

End;

 

Close(F);

{ закрыть файл }

End.

В данном примере показана типовая последовательность действий при работе с файлами. Цепочка вызовов «Assign –

113

ReSet/ReWrite – Read/Write – Close» должна присутствовать в любой программе, использующей типизированные файлы.

Последовательность вызываемых процедур при работе с типизированными файлами представлена на рис. 3.

 

Assign

ReSet

ReWrite

Read/Write

Write

 

Close

Рис. 3. Последовательность вызываемых процедур для типизированных файлов

При любой операции чтения/записи указатель текущей позиции смещается на одну единицу.

Для определения текущей позиции указателя применяется функция FilePos:

N := FilePos(F);

Эта функция возвращает положение указателя относительно начала файла. Самая первая позиция имеет номер 0. Переместить указатель в требуемую позицию можно, используя функцию Seek:

Seek(F,5); Seek(F,FilePos(F)-1);

Первый оператор устанавливает позицию указателя в файле после 5 элемента (и перед 6-м). Следующий оператор вызывает смещение указателя файла на 1 элемент назад относительно текущего положения указателя.

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

While not EOF(F) do Read(F,i);

Этот оператор считывает элементы файла, пока не доберется до конца файла.

114

Общее число компонент файла можно определить, вызвав функцию FileSize:

Count := FileSize(F);

Эта функция возвращает целое число, равное количеству компонент в указанном файле.

Отсечение последних компонент файла:

Truncate(f);

Процедура отсекает конец файла, начиная с текущей позиции включительно.

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

Нетипизированные файлы – это последовательность компонент произвольного типа.

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

Var

F: File;

Открытие нетипизированного файла выполняется процедурами ReSet или ReWrite. При этом может указываться дополнительный параметр, который указывает размер одного блока данных в байтах:

ReSet(F, 25);

или

ReWrite(F, SizeOf(Integer)*12);

Впервом примере открывается файл для чтения/записи с размером блока 25 байт. Во втором случае размер блока указывается через размер типа Integer. Функция SizeOf возвращает кол-во байт, отводимых под указанный тип или переменную. Если размер блока данных опущен, принимается размер по умолчанию, равный 128 байт.

Чтение данных выполняется следующей процедурой:

BlockRead(F, Biffer, Count); BlockRead(F, Biffer, Count, Result);

Впримерах из файла F в область памяти, задаваемую переменной Buffer, считывается Count блоков данных. Во втором случае в переменную Result дополнительно заносится число реально считанных блоков данных. Такая ситуация возможна в тех случаях,

115

когда конец файла встречается раньше, чем будет считано заданное число блоков. Если значения Count и Result различаются, это говорит о неполном чтении.

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

BlockRead(F, Biffer, Count); BlockRead(F, Biffer, Count, Result);

Частичная запись возможна в том случае, если на диске заканчивается свободное место.

Для нетипизированных файлов можно использовать процедуры Seek, FIlePos и FileSize, аналогично соответствующим процедурам типизированных файлов.

3.2.5. Сводная таблица процедур и функций для работы с файлами. Основные процедуры и функции работы с файлами приведены в табл. 1.

Таблица 1 Сводная таблица процедур и функций, используемых в работе с файлами

Проц/функ

Типизированный

Нетипизированный

Текстовый

Assign

+

+

+

Rewrite

+

+

+

Reset

+

+

+

Append

 

 

+

Read

+

 

+

Write

+

 

+

Readln

 

 

+

Writeln

 

 

+

BlockRead

 

+

 

BlockWrite

 

+

 

Seek

+

+

 

FilePos

+

+

 

FileSize

+

+

 

Flush

 

 

+

Close

+

+

+

EOF

+

+

+

EOLn

 

 

+

116

3.2.6. Примеры решения задач с использованием файлов.

Примеры решения задач с использованием типизированных файлов.

Задание.

Создать файл, содержащий 50 случайных целых чисел в диапазоне [10..30], вывести числа на экран в обратном порядке.

Программа.

Program FileTest1; const

N=50; var

F: file of integer; { объявление файла с целыми числами }

i:integer;

m:integer; begin

Assign(F,'test1.dat'); {связать файловую переменную с файлом}

ReWrite(F); { открыть файл для записи } for i:=1 to N do begin

m := Random(30-10+1)+10; { получить случайное число }

Write(F, m);

{ записать число в файл }

end;

 

 

Close(F);

{ закрыть файл }

ReSet(F);

{ открыть тот же файл для чтения }

for i:=50 downto 1 do begin

Seek(F,i-1); { установить указатель файла }

Read(F,m);

{ считать число из файла }

Write(m:4);

{ вывести число на экран }

end;

 

 

Close(F);

{ закрыть файл }

WriteLn;

 

 

end.

Результат выполнения программы:

117

Примеры решения задач с использованием текстовых файлов.

Задание.

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

Программа

Program FileTest2; Type

{ объявление массива для подсчета символов }

RateArray = array ['A'..'Z'] of integer; var

FT: Text; { объявление файловой переменной текстового типа } ch: char;

N,i: integer; s: String;

rate: RateArray; begin

{начальная инициализация счетчика символов } for ch:='A' to 'Z' do

rate[ch] := 0;

{операции с файлом }

Assign(FT,'test.txt'); {связать файловую переменную с файлом} ReSet(FT); { открыть файл для чтения }

while not EOF(FT) do begin { пока не конец файла }

ReadLn(FT,s); { считать строку из файла

}

{ (с переходом на новую строку) }

 

N := Length(s); { взять длину строки }

 

for i:=1 to N do begin { цикл по всем символам строки }

ch := UpCase(s[i]); {перевести символ в верхний регистр} if ch in ['A'..'Z'] then { если символ–английская буква }

rate[ch] := rate[ch]+1;{увеличить счетчик соотв.символа} end;

end;

Close(FT); { закрыть файл } for ch:='A' to 'Z' do

Write(ch,': ',rate[ch]:2,' '); {вывести частоты символов}

118

WriteLn;

end.

Исходные данные для тестирования программы talk to me softly

there's something in your eyes don't hang your head in sorrow and please don't cry

i know how you feel inside I've i've been there before somethin's changin' inside you and don't you know

Результат выполнения программы

Примеры решения задач с использованием нетипизированных файлов.

Задание.

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

Программа:

 

 

Program FileText3;

 

 

Uses

 

 

 

Crt;

{подключение модуля Crt – работа с текстовой

информацией на дисплее}

 

 

Var

 

 

 

f : file;

{объявление

нетипизированной

файловой

переменной}

 

 

 

i, k, s : integer;

 

 

Mas : Array [1..10] of byte;

{описание массива}

 

Begin

 

 

 

ClrScr;

{Процедура очистки экрана}

 

Randomize;

 

 

 

 

119