Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инф-госы теория и практика.doc
Скачиваний:
28
Добавлен:
29.08.2019
Размер:
3.77 Mб
Скачать

8. Работа с файлами

Введение файлового типа в язык ПАСКАЛЬ вызвано необходимостью обеспечить возможность работы с периферийными (внешними) устройствами ЭВМ, предназначенными для ввода, вывода и хранения данных. Файловый тип данных или файл определяет упорядоченную совокупность произвольного числа однотипных компонент.

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

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

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

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

'A:LAB1.DAT'

'c:\ABC150\pr.pas'

'lab3.pas'.

В Паскале имеются три класса файлов:

  • текстовый файл;

  • типизированный файл;

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

Начнем с текстовых файлов.

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

Текстовый файл содержит последовательность символов, организованных в строки, причем каждая строка заканчивается специальным символом возврата карет ки CR = #13 и перевода строки LF = #10.

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

var

in_f11e: text;

Переменная in_file сопоставляется внешнему файлу на диске или какому-либо устройству процедурой Assign:

Assign(in__file. 'C:\user\Newton\my_file'):

Assign(my_text, 'prn'};

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

Следующий шаг заключается в том, что внешний файл надо открыть для записи или чтения. При открытии файла выполняются необходимые системные операции, подготавливающие файл к записи или считыванию информации. Текстовый файл my_fi1e открывается процедурой Reset(my_file) только для чтения и процедурой Rewrite(my_file) — только для записи.

По завершении обработки файла программой он должен закрываться. После выполнения этой операции внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом. Закрывается файл с помощью процедуры Close(my_f11e).

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

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

Для чтения из текстового файла или записи в текстовый файл можно использовать процедуры Write, WriteLn, Read и ReаdLn. В качестве первого параметра в этих процедурах должна быть указана файловая переменная:

Read (in_file, a, x);

WriteLn (out_file, ‘Urgent message!’);

Первая процедура присваивает а и х значения очередных двух элементов из файла in_file.

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

Оператор вывода допускает описание формата вывода. Если а является выражением целого, булевого или строкового типа, то

WriteLn(a:n);

означает запись а в правые позиции поля размером в n позиций. Если указанна длина поля n меньше, чем длина значения а, то заданная длина игнорируется. Например:

WriteLn(‘12345’:3);

приведет к выводу всего символьного значения '12345'. Значение n может быть и отрицательным, в этом случае значение записывается в левые n позиций.

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

Write(a:10:3);

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

Напомню, что в Паскале имеются две стандартные файловые переменные текстового типа: Input и Output. Стандартная файловая переменная Input представлю" собой доступный только для чтения файл, связанный со стандартным файлом ввода операционной системы (клавиатурой). Вторая стандартная файловая перемен:-. Output — это доступный только для записи файл, связанный со стандартным файлом вывода (дисплеем).

Процедура file_output(параметры) открывает текстовый файл для записи.

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

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

var

a: file of type_ID;

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

При работе с типизированными файлами можно использовать уже знакомые нам процедуры Assign, Reset и Rewrite. Следует заметить, что текстовый файл, открытый процедурой Reset, доступен только для чтения, а типизированный — еще и для записи. Процедуры Read и Write здесь используются по-другому. Отличие заключается в том, что каждый из параметров в рассматриваемом случае должен быть

переменной типа type_ID, а выражения и константы недопустимы. Процедуры ReadLn и Writeln применяются только к текстовым файлам.

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

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

Var

A: file;

Такая файловая переменная связывается с внешним файлом обычным образом. В числе параметров процедур Reset и Rewrite для нетипизированных файлов, кроме файловой переменной, имеется необязательный второй параметр типа Word:

Reset(a, n):

Rewrite(a, n):

Дополнительный параметр n описывает размер индивидуальной записи в файле (в байтах). Если параметр n отсутствует, его значение по умолчанию принимается равным 128, однако рекомендуется явно указывать значение 1. Это связано с тем, что при любом другом значении величины записи в файле могут присутствовать неполные записи, а это не всегда удобно.