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

16.4.Файлы

Программа, написанная на языке Pascal, должна каким–то образом обмениваться данными с внешними устройствами: получать данные с клавиатуры, магнитного диска, выводить дан­ные на экран, принтер и т.д. Для работы с внешними устройствами используются файлы. Файлы – это значения файлового типа данных – еще одного стандартного сложного типа в языке.

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

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

Понятие файла достаточно широко. Это может быть обычный файл на диске, коммуникационный порт ЭВМ, устройство печати, клавиатура или другие устройства.

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

Файлы на внешних устройствах часто называют физическими файлами. Их имена определяются операционной системой. В программах на языке Паскаль имена файлов задаются с помощью строк. Например, имя файла на диске может иметь вид: 'a:\lab1.dat'; 'c:\abc150\pr.pas'; 'lab3.pas'.

Операционная система MS DOS не делает особого различия между файлами на дисках и лентах и устройствами ЭВМ и портами коммуникаций. В Turbo Pascal могут использоваться имена устройств и портов, определенные в MS DOS, например: 'con', 'lpt1', 'prn', 'com1', 'aux', 'nul'.

С файловой системой Turbo Pascal связано понятие буфера ввода–вывода. Ввод и вывод данных осуществляется через буфер. Буфер – это область в памяти, которая выделяется для каждого файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь объем буфера не будет заполнен. Только после этого или после специальной команды сброса происходит передача данных на внешнее устройство. При чтении из файла данные вначале считываются в буфер, причем данных считывается не столько, сколько запрашивается, а сколько поместится в буфер. Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с внешними устройствами.

Для работы с файлами в программе необходимо определить файловую переменную. Turbo Pascal поддерживает три файловых типа: текстовые файлы, компонентные файлы, бестиповые файлы.

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

В результате выполнения программы происходит преобразование одного текстового файла (называемого Input) в другой текстовый файл (называемый Output). Оба эти файла являются стандартными и служат для ввода/вывода данных.

Над файлами можно выполнять два явных вида действий:

1. Просмотр (чтение) файла.

2. Создание (запись) файла – выполняется путем добавления новых компонент в конец первоначально пустого файла.

Файлы, с которыми работает программа, должны быть описаны в программе. Часть файлов (представляющих собой физические устройства) имеет в операционной системе стандартные имена. Например, для чтения данных с клавиатуры и вывода результатов на экран мони­тора мы пользуемся стандартными файлами Input и Output. Файл – принтер имеет имя Prn.

И мена нестандартных файлов, используемых в программе, необходимо описывать в разделе переменных. Описание файлового типа соответствует диаграмме:

Файл, компоненты которого являются символами, называется текстовым и имеет стандартный тип Text, т.е.:

Type Text = File of Char;

Примеры:

Type

ExtClass = File of Person;

CardList = File of Integer;

Var

F : Text;

Data : File of real;

List1, List2 : CardList;

Class10A, Class10B : ExtClass;

 Для работы с нестандартными файлами имя файла должно быть отождествлено с реально существующим объектом – внешним устройством. Именно, если нам необходимо обработать дан­ные из файла, находящегося на магнитном диске и имеющего (внешнее) имя D:\ExtName.dat, мы должны сообщить системе, что работая с файлом IntName (читая из него данные или запи­сы­вая в него данные), мы работаем с файлом ExtName.dat, находящимся на диске D:. Для отождествления внутреннего имени файла со внешним именем используется проце­ду­ра Assign(< внутреннее имя >, < 'внешнее имя'>).

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

    • Процедура Rewrite(<имя файла>) – открывает файл для записи. Если файл ранее существовал, все данные, хранившиеся в нем, уничтожаются. Файл готов для записи первой компо­ненты.

    • Процедура Reset(<имя файла>) – открывает файл для чтения. Файл готов для чтения из него первой компоненты.

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

Для обмена данными с файлами используют процедуры Read и Writе.

    • Процедура Read(<имя файла>, <список ввода>) читает данные из файла (по умолчанию имя файла – Input). Список ввода – это список переменных.

    • Процедура Write(<имя файла>, <список вывода>) записывает данные в файл (по умолча­нию имя файла – Output). Список вывода – это список выражений.

Если F – файл типа Text, то в списке ввода/вывода допустимы переменные/выражения типа Integer, Real, Char, String[N]. В других случаях типы всех компонент списка должны совпа­дать с типом компоненты файла.

При работе с файлами применяют стандартные логические функции:

    • Eof(F) (end of file) – стандартная функция – признак конца файла. Если файла F исчерпан, то Eof(F) = True, в противном случае Eof(F) = False.

    • Eoln(F) (End of line) – стандартная функция – признак конца строки текстового файла. Если стро­ка текстового файла F исчерпана, то Eoln(F) = True, в противном случае Eoln(F) = False. Фун­к­ция Eoln определена только для файлов типа Text. Обычно в программах используют либо тексто­вые файлы, либо файлы, компонентами которых являются структурированные данные (например, записи).

Функция ioresult: integer возвращает целое число, соответствующее коду последней ошибки ввода–вывода. При нормальном завершении операции функция вернет значение 0. Значение функции ioresult необходимо присваивать какой–либо переменной, так как при каждом вызове функция обнуляет свое значение. Функция ioresult работает только при выключенном режиме проверок ошибок ввода – вывода или с ключом компиляции {$i–}.

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

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

Пусть F – файл записей вида (поле ключа, поле данных). Требуется сформировать файл G, содержащий те компоненты F, ключи которых удовлетворяют условию: значение ключа – целое число из интервала ]Max, Min [.

Program FileForm;

Type Component = Record

Key: Integer; { поле ключа }

Data: String[20] { поле данных}

End;

OurFile = File of Component;

Var F, G : OurFile;

Max, Min : Integer;

X: Component;

Function Correct(var U: Component): Boolean;

begin

Correct := (U.Key < Max) and (U.Key > Min)

end;

 Begin

Read(Max, Min);

Assign(F, 'D:InpFile.dat'); {определено значение F }

Assign(G, 'D:OutFile.dat'); {определено значение G }

Reset(F); {файл F открыт для чтения}

Rewrite(G); {файл G открыт для записи}

While not(Eof(F)) do begin {цикл чтения F – записи G}

Read(F, X);

If Correct(X) then Write(G, X)

end;

Close(G) {файл G закрыт}

End.

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