Смекни!
smekni.com

Модули, записи и файлы (стр. 3 из 4)

Произведение 2-го столбца =-0.0007

Произведение 3-го столбца =0.0187

Произведение 4-го столбца =0.0264

Произведение 5-го столбца =0.0243

Максимальное произведение =0.0264

Глава 6. Записи.

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

Структура обьявления типа записи такова:

<имя типа> = RECORD <пс. полей> END

Здесь <имя типа> - правельный индификатор;

RECORD, END – зарезервированные слова (запись, конец);

<сп. полей> - список полей; представляют собой последовательность

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

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

type

birthday = record

day, month : byte;

year : word:

end;

var

a,b : Birthday;

. . . . . . . .

В этом примере тип Birthday есть запись с полями DAY, MONTH, и YEAR; переменные А и В содержат записи типа Birthday.

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

a : = b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:

a.day := 27; b.year := 1991;

Чтобы упростить доступ к полям записи, используется оператор присоединения WITH:

WITH <переменная> DO <оператор>

Здесь WITH, DO – ключевые слова (с, делать);

<переменная> - имя переменной типа запись, за которым,

возможно, следует список вложенных полей;

<переменная> - любой оператор Турбо Паскаля.

Например:

with c.bd do month := 9;

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

.

Глава 7. Файлы.

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

7.1. Операция с файлами как единое целое.

Программирование доступа к файлу в языке Turbo Pascal начинается с описания файловой переменной (переменной файлового типа). Это опи­сание строится с помощью служебного слова file, после которого (после служебного слова of) может быть указан тип отдельных элементов файла, например:

var

F : file of integer;

При необходимости можно отдельно определить некоторый файловый тип, которым в дальнейшем пользоваться при описании файловых пере­менных:

type

RecordFile = file of record

А, В : real;

end;

var

Fl, F2 : RecordFile;

Очень важно различать собственно файл (область памяти на магнит­ном носителе с некоторой информацией) и переменную файлового типа в некоторой Turbo Pascal- программе. Считается, что файловая переменная является представителем некоторого дискового файла в программе. Для того, чтобы реализовать доступ к файлу па магнитном диске, программа должна связать его с файловой переменной. Для этого необходимо сопос­тавить переменную с именем файла. Это имя представляется в виде стро­ки, содержащей полное имя файла и, быть может, цепочку объемлющих каталогов и обозначение дисковода. Такая строка носит название маршру­та (или пути) к файлу и формируется по общим правилам MS-DOS.

Связывание маршрута и файловой переменной производится стан­дартной процедурой Assign, которой передаются два параметра: имя пе­ременной файлового типа и строка с именем (маршрутом) дискового файла, например:

Assign (F, 'с: &bsol;books&bsol;book4&bsol;test3 .раз ' ) ;

Помимо маршрута, во втором параметре может быть указано условное (символическое) обозначение некоторого «псевдофайла» MS-DOS, то есть файла, связанного с конкретным физическим устройством. Допускаются имена, в основном совпадающие с принятыми в MS-DOS обозначениями (‘con’ – консоль, то есть экран дисплея и/или клавиатура, ‘lpti’ или ‘prn’ – печатающее устройство и т. д.).

До тех пор, пока файловая переменная не связана с каким-либо дис­ковым файлом, никакие операции с ней в программе невозможны, Заме­тим, что можно связать файловую переменную с еще не существующим дисковым файлом. Это может быть оправдано для случая последующего создания Turbo Pascal-программой файла с данным именем с помощью некоторой системной процедуры.

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

Rename ( var f; nevname : string );

Erase ( var f );

Основным параметром этих процедур является файловая переменная (она может идентифицировать файл любого типа, и к ней должна была быть ранее применена процедура Assign), а процедуре Rename дополни­тельно передается новое имя файла. Действие указанных процедур осно­вывается на соответствующих DOS-функциях и функционально эквива­лентно командам ren и del командного процессора.

7.2. Структура файлов

7.2.1Открытие и закрытие файлов

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

Важнейшим моментом при использовании переменных файловых ти­пов является интерпретация файла как потенциально бесконечного спи­ска значений одного и того же (базового) типа. Например, описание пе­ременной F вида

var

F : file of integer;

понимается как определение в программе под именем F списка неопреде­ленного количества целых чисел, расположенного на некотором внешнем запоминающем устройстве (например, на магнитном диске).

С каждой переменной файлового типа также связано понятие теку­щего указателя файла. Текущий указатель можно понимать как скрытую переменную (то есть переменную, неявно описанную вместе с файловой

переменной), которая обозначает ("указывает" на) некоторый конкретный элемент файла. Таким образом, можно графически так представить ин­терпретацию файла, связанного с переменной F: 0 1 2 N

Целое Целое Целое . . . . . Целое . . .

Текущий указатель —————

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

Заметим, что один и тот же внешний файл в различных Turbo Pascal-программах (или даже в различных частях одной и той же программы) может интерпретироваться по-разному, например, как последовательность целых чисел, или как последовательность символов, или как последова­тельность некоторых записей, и т. д. Эта возможность очень важна и час­то используется в работе с файлами сложной структуры. Например, в процессе работы с внутренним представлением файлов баз данных (в частности, с DBF-файлами) может понадобиться интерпретировать файл по-разному в зависимости от того, какую его компоненту (заголовок или содержательную часть) мы обрабатываем.

Нужно также отметить, что все операции с файлами в языке Turbo Pascal реализованы с использованием базовых средств операционной сис­темы; в частности, понятие текущего указателя файла поддержано в MS-DOS. Однако все перемещения по файлу (как явное управление указателем, так и сдвиги при обменах) выполняются в терминах байтов. Таким образом, все аспекты, связанные с типизацией содержимого фай­лов, представляют собой системную надстройку языка Turbo Pascal.

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

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

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

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