Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Простая типизированная константа




 

Задается как простая переменная.

Пример:  Const A:Integer=1267;

                                 Kol:Real=12,32;

                                 Sim:Char =’Z’

                                 B:Char=Ord(65);

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

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

Пример: Const X:Integer=0;

                                 Y:Integer=50;

                        Type Mas: Array [X..Y] of Integer; это недопустимо.

Структурированная (сложная) типизированная константа

 

Типизированная константа массива

 

Пример:

Type Sost = (cold, warm, hot);

              Massiv = Array [Sost] of string[5];

Const S: Mas = (‘cold’, ‘warm’, ‘hot’);

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

Sost[cold]=’cold’

Sost[warm]=’warm’

Sost[hot]=’hot’

Каждый тип, кроме типа массива и указателя, представляет собой допустимый тип компонентов константы массива. При типах массива Character разрешены отдельные символы и символьные цепочки.

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

Пример:

Type Massiv = Array [0..1,0..1,0..1] of Integer;

Const chislo: Massiv = (((0,1),(2,3)),((4,5),(6,7)));

Begin

              Writeln(chislo[0,0,0],’=0’);

Writeln(chislo[0,0,1],’=1’);

Writeln(chislo[0,1,0],’=2’);

Writeln(chislo[0,1,1],’=3’);

Writeln(chislo[1,0,0],’=4’);

Writeln(chislo[1,0,1],’=5’);

Writeln(chislo[1,1,0],’=6’);

Writeln(chislo[1,1,1],’=7’);

     End.

Типизированная константа записи

 

Пример:

Type chislo = Record

a,b,c: Integer

 end;

              Zvet = (Krasn, Gelt, Zelen, sin);

              Tkan = (Sherst, Shelk, Hlopok);

              Platye = Record

Dizain : Array [1..4] of Zvet;

                        Material : Tcan

end;

              Const Nomer : chislo = (a:0, b:0, c:0);

                        Model:Platye=(dizain: (krasn, gelt, zelen, sin); Material: Hlopok);

                        Matrica: Array[1..3] of

chislo = ((a:1, b:4,c:5), (a:13,b:8,c:55), (a:200,b:16,c:-65));

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

Если константа записи содержит варианты, то программист сам отвечает за то, чтобы специфицировались лишь блоки данных достоверной переменной.

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

 

Типизированная константа множества.

 

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

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

Пример:

Type Propisnoy = Set of ‘A’..’Z’;

              Strochny = Set of ‘a’..’z’;

Const PropBukw : Propis =[‘A’..’Z’];

              StrochnBukw : Stroch =[‘a’, ’e’, ‘l’, ‘c’, ‘u’];

              Simvol : Set of char = [‘_’..’/’, ‘:’..’?’, ‘[‘..’^’, ‘{‘..’~’];

ПРЕОБРАЗОВАНИЕ ТИПОВ

 

Тип переменной позволяет не только установить длину ее внутреннего представления, но и контролировать те действия, которые осуществляются над ней в программе. Контроль за использованием переменных еще на этапе компиляции программы – важное преимущество Турбо Паскаля перед другими языками программирования, в которых допускается автоматическое преобразование типов. Фактически именно та вольность, с какой, например, PL/1 преобразует по умолчанию различные типы данных, послужила объектом наиболее сильной его критики.

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

 

В Паскале почти невозможны неявные (автоматические) преобразования типов. Исключение сделано только в отношении констант и переменных типа Integer, которые разрешается использовать в выражениях типа Real.

Пример:

Var X : Integer;

  Y : Real;

Y:=X+2 - правильно, хотя справа от знака присваивания стоит целочисленное выражение, а слева – вещественная переменная. Компилятор сделает необходимые преобразования автоматически.

X=2.0 – неверно, так как автоматическое преобразование типа Real в тип Integer в Паскале запрещено.

Использование стандартных функций для преобразования

 

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

В частности, для преобразования Real в Integer имеются две встроенные функции:

Round округляет Real до ближайшего целого,

Trung усекает Real путем отбрасывания дробной части.

X:=Y/X – нельзя,

X:=round(Y/X) – можно.

Ord преобразует Char в Integer,

Chr преобразует Integer в Char.

Пример. Программа выводит на экран символ и соответствующий ему внутренний код.

Var simvol : char;

Begin readln (simvol);

              Writeln (simvol, ‘=’, ord(simvol));

End.

Явные преобразования типов

 

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

В языке программирования Паскаль выражение 1/2 всегда имеет значение 0.5 и поэтому оператор X:=1/2 для целого Х просто недопустим. В то же время

Var Y : Real;

              --------------

Y : = 1 div 2;

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

Эквивалентность типов

 

Еще две функции для целого типа:

Dec (X[,N]) – уменьшение значения X на N; если N не задан, то на 1,

Inc (X[,N]) – увеличение.

Над символами и строками символов (тип string) применима единственная операция – сцепление строк (+).

Var slovo: string;

Begin

              Slovo:= ‘turbo’ + ‘-‘ + ‘pascal’;

              Writeln (slovo);

End.

Пример: А,В, С – типа integer.

              А = В and С < 0 где ошибка?

Надо (А = В) and (С < 0) так как логические операции имеют более высокий приоритет, чем операции отношения:

0 not

1 * / div mod and chr chi

2 + - or xor

3 = <> < > <= >= in.

Совместимость типов

 

Паскаль – это типизированный язык. В нем соблюдается концепция типов, в соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов.

Два типа считаются совместимыми, если:

1) оба они есть один и тот же тип,

2) оба они действительные,

3) оба они целые,

4) один тип есть тип – диапазон второго типа,

5) оба они являются типами – диапазонами одного и того же базового типа,

6) оба они являются множествами, составленными из элементов одного и того же базового типа,

7) оба они являются упакованными строками (определены предшествующим словом Packed) одинаковой максимальной длины,

8) один тип есть тип – строка, а другой тип – строка, упакованная строка или символ,

9) один тип есть любой указатель, а другой – не типизированный указатель,

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

 

ФАЙЛОВЫЕ ТИПЫ

 

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

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

- формировать большие массивы данных,

- своевременно их корректировать,

- транспортировать их в другие программы

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

Определение файлового типа

 

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

исходные данные;

программа;

результаты;

любые тексты

Файл в операционной системе представляет собой последовательность элементов одного типа, расположенных на внешнем уровне.

Различают три основных вида файлов:

- последовательные;

- прямого доступа

- индексированные (файлы с ключами).

В двух последних типах данных поиск необходимых данных может осуществляться по адресам данных.

Турбо-Паскаль работает с последовательными файлами.

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

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

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

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

 

Структура файла

 

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

Если число компонентов равно нулю, файл называется пустым. Итак, мы видим, что файл отличается от массивов, записей и множеств, т.к. это структура последовательного доступа, все компоненты которой относятся к одному и тому же типу: любому, кроме типа «файл». Нельзя создать файл файлов!

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

Характеристики файла:

последовательный доступ;

переменная длина;

существование буферной переменной, –

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

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

Для определения признака конца файла используется встроенная стандартная функция EOF (файловая переменная);

Она определяет, достигнут или нет конец файла.

EOF = True, если конец файла достигнут;

EOF = False, если нет.

Если файл не имеет компонентов, то он называется пустым и функция EOF = True для пустого файла.

Функцию EOF можно использовать в логических выражениях и в частности, в операторах цикла.

Пример:While Not EOF ( имя ) Do Begin

…….

End;

Если буферная переменная сдвинута за пределы конца файла (end of file), стандартная логическая функция eof (F) = true, в противном же случае – false.

Файловый тип – единственный тип значений, который связывает программу с внешним устройством (ввод-вывод данных).

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

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

В общем и целом имеется две различных разновидности файлов:

двоичные файлы;

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

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

Текстовые файлы состоят из символов (char), а кроме того, каждый текстовый файл делится на строки. Каждая строка состоит из любого числа байтов и заканчивается символом конца строки. Файл завершается символом окончания файла. Таким образом, текстовые файлы – это файлы, состоящие из символов, причём не все байты представляют собой печатаемые символоы. Компонентами текстового файла являются строки различной длины, разделённые управляющими символами.

Имя файла

 

Каждому файлу, размещённому на диске, присваивается уникальное имя, длина которого вдля MS-DOS не должна превышать восьми символов. Длина расширения файла не должна превышать трёх символов.

Имя файла – это любое выражение строкового типа, которое строится по правилам определения имён в дисковой операционной системе (DOS):

- имя содержит до восьми разрешённых символов (буквы, цифры и знаки подчеркивания);

- за именем может следовать расширение – последоватенльность до трёх разрешенных символов;

- расширение, если оно есть, отделяется от имени точкой.

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

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

Если имя диска не указано, подразумевается устройство по умолчанию – то, которое было установлено в операционной системе перед началом работы программы.

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

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

 

Файловый тип или переменную файлового типа можно задать одним из трёх символов:

имя = file of тип;

имя = text;

имя = file;

Пример: Var finp: text;

Fout: file of string;

const name = ‘c:\dir\subdir\out.txt;

…………………………

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

Общий вид описания файлового типа:

Type имя = File of тип;

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

Пример:

Type Number = file of integer; {файл целых чисел}

Symb = file of ‘A’..’Z’; {файл прописных латинских букв}

Стандартный тип Text определяет тип–файл, содержащий символы, объединённые в строки. Следует иметь в виду, что тип Text в Турбо-Паскале не эквивалентен типу file of char.

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

Пример:    Type untyp = file;

Итак, в Паскале файловый тип описывается следующим образом:

type T = TValue;{ тип компоненты файла }

< имя файлового типа > = file of T;

Как обычно, файловый тип может быть введен в употребление в разделе типов, как было описано выше, либо непосредственно задан при описании переменных, например:     var myfile: file of T;

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

Файловая переменная

 

Каждому файлу ставится в соответствие уникальная файловая переменная. Кроме того, обычными программными средствами нельзя создать программы, позволяющие взаимодействовать с устройствами ввода-вывода, кроме терминалов пользователя. Своеобразным «окном» между программами и внешними устройствами является файловая переменная. Поэтому в каждой программе, где предусматривается взаимодействие с устройствами ввода-вывода, организуется определённым образом логическая связь устройства ввода-вывода с файловой переменной.

Пример:

Type ZAP = Record

FIO: array [1..10] of char;

God: Integer

end; { of Record }

F = File of ZAP;

Тогда любая переменная типа F – это последовательный файл, состоящий из записей. Каждая запись имеет 2 поля: FIO (фамилия) и God (год рождения).

Переменные файлового типа, как и обычные переменные, описываются в разделе переменных:            Var C: F;

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

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

Описание файла в разделе описания переменных:

Var Myfile: File of Integer;

Это означает, что в прграмме под файловым именем Myfile понимается неопределённое количество целых чисел, которые в виде физического файла могут располагаться на некотором внешнем уровне.

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

Если программа взаимодействует с внешними файлами (хранимыми на диске), то файлы должны быть описаны в программе либо явно в разделе переменных Var, либо с использованием раздела типов Type.

Var имя файла: File of базовый тип

Пример:    Var FT: File of char; (* файл символьных данных *)

Finp: File of real; (* файл действительных данных *)

М: File of integer; (* файл целых данных * )

Файлы символьных данных называются текстовыми файлами.

Определение данных с использованием раздела описания типов Type делает программу более универсальной и упрощает отладку программы.

Type имя типа = File of  базовый тип;

Var имя переменной: имя типа;

Пример:    Type T = File of Char;

Var FT: T;

Здесь Т – введённое нами имя типа.

Пример описания файловых типов и переменных:

Type SS = file of Char;

Person = record

name: string [20];

adress: string [25];

sex: ( man, woman );

day: 1..31;

month: 1..12;

year: 1900..2008

end;

Var F1, F2: SS;

Table: file of string [50];

Base: file of person;

Data: file of integer;

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

Операции над файлами

 

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

Операции по установке связей между файловой переменной и внешним устройством или внешним файлом на магнитном носителе, т.е. операции по открытию файлов, а так же операции по «развязке» этих связей, т.е. закрытию файлов реализуются процедурами:

Assign             Rewrite            Close

Reset               Append           Flush

Связывание файловой переменной с именем файла осуществляется обращением к встроенной процедуре ASSIGN:

Assign ( файловая переменная, имя файла ).

Здесь имя файла – переменная или константа типа String. Имя должно быть написано в соответствии с правилами MS DOS, может включать путь и не должно превышать 79 символов. Если строка имени пустая, осуществляется связь со стандартным файлом ввода или вывода (как правило, консолью).

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

Примеры:

1) Установление связи с внешним файлом на магнитном носителе. В этом случае имя внешнего файла представляет собой спецификацию файла:

Assign (Namefaile,’C:\direct\tfile.dat’);

Assign (Kandy,’D:\direct\fio.dat’);

2) Установление связи программного файла с внешним устройством. Для ввода с клавиатуры, если далее следует операция считывания данных; либо вывода на экран дисплея, если далее следует операция записи данных:

Assign (inputfile,’CON’);

3) Для вывода данных на печатающее устройство (допускается подключение до трёх печатающих устройств): LPT1 (синоним PRN), LPT2 и LPT3.

Assign ( Outhut,’LPT1’ );

4) Для последующего обмена информацией по коммуникационным каналам. Смысл записи псевдофайлов COM1 (или синоним AUX) либо СОМ2 определяется конкретным внешним устройством. Например, это может быть «мышь» или графопостроитель (плотер), либо узел при сетевой связи компьютеров:

Assign ( interfile,’COM1’ );

5) Установление связи с фиктивным внешним устройством. Например, при отладке программы вывод информации блокируется, но конкретная работа программы при этом не нарушается:

Assign (myfile,’NUL’);

 

Реализация операций обмена данными

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

Эта операция в общем случае выполняется следующими процедурами:

Reset (файловая переменная, размер записи);

Reset (файловая переменная);

Rewrite (файловая переменная);

Rewrite (файловая переменная, размер записи);

Append (файловая переменная);

 

Основные процедуры обработки файлов

Reset (F) – подготовка чтения файла F. При этом указатель позиции помещается в начало файла. Если файл не пустой, то переменной F присваивается значение его первого компонента, а функция eof (F) = false. Параметр «размер записи» указывается лишь в случае обработки нетипизированных файлов. В результате обработки процедуры Reset, если соответствующий файл обнаружен, текущий указатель устанавливается в начале файла, т.е. на нулевом элементе файла. Если же внешний файл не обнаружен, то вырабатывается условие ошибки. Оператор процедуры reset(f) переводит файл f в режим чтения и устанавливает окно на первую позицию файла. Оператор процедуры read(f,v) присваивает переменной v значение текущей компоненты из файла f и передвигает окно на следующую позицию. Процедура reset может применятся к одному и тому же файлу несколько раз и при этом содержимое его не изменяется.

Rewrite (F) – подготовка записи в файл. Текущее значение файловой переменной F становится равным emply (пустой). Функция eof (F) = true. Может записывать новый файл. Оператор процедуры rewrite(f) устанавливает файл в режим записи, если раньше в этот файл были записаны какие-то данные, то они теряются. Оператор процедуры write(f,x) записывает в файл f очередную компоненту x, после чего окно сдвигается на следующую позицию. Общий вид оператора подготовки запист:

Rewrite (файловая переменная, [имя файла]);

Если внешнее имя файла опущено при открытии файла для записи, то файловая переменная трактуется как временный файл, который по окончанию работы программы ликвидируется. Параметр. «размер записи» указывается лишь в случае нетипизированного файла. В результате обработки процедуры ReWrite, если соответствующий файл обнаружен, текущий указатель устанавливается в начале файла, на место нулевого элемента записывается «символ конца файла». Другими словами, процедура rewrite очищает содержимое файла, а текущий указатель устанавливается в позицию готовности записи нулевого элемента.

Непосредственные операции ввода–вывода выполняются процедурами read и write. Обращения к этим процедурам:

Read (файловая переменная, выражение);

Write (файловая переменная, выражение);

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

write (файловая переменная);

Если файл с таким именем уже существует, то вся информация, хранившаяся ранее в этом файле, становится недоступной. Процедура Write записывает в файл очередной компонент и переставляет указатель на свободное место. Таким образом, число компонентов файла увеличивается на единицу.

В принципе все операции создания и чтения последовательного файла можно сформировать из приведённых простых процедур и стандартной функции eof. На практике же часто полезно совмещать перемещение по файлу с доступом к буферной переменной. Поэтому введём две новые процедуры Read и Write следующим образом:

Read (F,X),  где Х – некоторая переменная.

Write (F,Y), где Y – некоторое выражение.

Read и Write – специальные процедуры, распространённые для работы с переменным числом параметров (Х1,Х2,…,ХN – переменные, а Y1,Y2,…,YN – выражения).

Обращение к функции Read (F,X1,…,XN) эквивалентно конструкции

begin

Read (F,X1);

Read (F,X2);

…………….

Read (F,XN)

end;

к функции Write (F,Y1,Y2,…,YN) - эквивалентно конструкции

begin

Write (F,Y1);

Write (F,Y2);

…………….

Write (F,YN)

end;

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

While Not EOLN (имя) Do,

а для перехода на новую строку файла – оператор Readln (имя).

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

Для чтения файла необходимо выполнить следующие действия:

открыть файл для чтения ( процедура Reset );

ввести данные файла в программу ( процедура Read );

закрыть файл для чтения ( процедура Close )

Общая форма чтения файла:

Reset ( файловая переменная, [имя файла] );

……………..

Read ( файловая переменная, параметры );

……………..

Close ( файловая переменная );

Читать файл можно только с начала, предварительно открыв его на чтение процедурой Reset.

Порядок выполнения операций чтения.

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

Пример.При открытии файла с именем С для чтения соответствующая буферная переменная принимает значение первой записи файла С. Если файл пуст, то EOF (C) = True, а значение буферной переменной не определено. Для чтения очередной записи из файла С необходимо выполнить процедуру Read (C). При этом считанная запись станет доступной через буферную переменную. При окончании записи элементов в файл С его необходимо закрыть при помощи процедуры Close (C). При этом файл С сохраняется на внешнем носителе, если при его открытии на запись было указано внешнее имя.

Файловая переменная логически связана с внешним устройством. Если внешнее имя файла опущено при открытии файла для чтения, то файловая переменная трактуется как временный файл, созданный ранее в этой же программе.

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

Порядок выполнения операции записи.

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

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

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

Встроенная процедура rewrite инициирует запись информации в файл.

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

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

Если же соответствующие файлы на внешнем носителе не обнаружены, то процедуры Append и ReWrite открывают новый файл с указанным именем, соответствующим заданной файловой переменной.

Если работа с данным файлом завершена, то рекомендуется выполнить операцию закрытия файла. Она реализуется с помощью процедуры

Close(файловая переменная).

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

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

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

Процедура Rename (файловая переменная, новое имя). Переименовывает файл. Перед выполнением процедуры Rename необходимо закрыть файл, если он ранее был открыт процедурами Reset, ReWrite, Append. Внешний файл, с которым связана файловая переменная, получает новое имя, заданное параметром «новое имя». Этот параметр по своим характеристикам аналогичен параметру «имя файла» в процедуре Assign.

Процедура Erase (файловая переменная) уничтожает файл.

Erase (файловая переменная).

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

Процедура Flush (файловая переменная). Поскольку обмены с файлами реализуются через некоторый внутренний буфер в оперативной памяти, то в процессе обработки информации могут возникать ситуации задержки данных, то есть «застревание» информации в буфере. Если же в процессе обработки информации не требуется пополнять буфер, то есть считывать следующий элемент, либо разбивать находящиеся в буфере данные на порядки, то с помощью процедуры Flash (файловая переменная) выполняется принудительный сброс информации при записи и очистка буфера. Процедура Flush игнорируется, если файл был инициирован для чтения процедурой Reset. Ценность этой процедуры сомнительна, так как все её функции реализуются процедурой Close, при выполнении которой закрытие файла автоматически сопровождается ликвидацией соответствующего буфера.

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

Процедура ChDir (путь) – излагает текущий каталог (директорию). Здесь «путь» – строковое выражение, содержащее путь к установленному по умолчанию каталогу. Параметр. «путь» может быть только типа String. Таким образом, ChDir устанавливает новый текущий каталог, путь к которому находится в процедуре «путь».

Процедура GetDir(устройство, каталог) позволяет определить имя текущего каталога (каталога по умолчанию). Здесь «устройство» - выражение типа Word, содержащее номер устройства:

              0 – устройство по умолчанию,

              1 – диск А,

              2 – диск В и т. д.

Здесь «каталог» - переменная типа String, которая определяет путь к текущему каталогу на указанном диске.

Процедура MkDir (каталог) создаёт новый каталог на указанном диске. Здесь «каталог» - выражение типа String, задающее путь к каталогу. Последним именем в пути, то есть именем вновь создаваемого каталога, не может быть имя уже существующего каталога.

Процедура RmDir (каталог) удаляет каталог. Удалённый каталог должен быть пустым, то есть не содержать файлов или имён каталогов нижнего уровня.

Функция IOResult : Word возвращает признак последней операции ввод – вывод. Если операция завершилась успешно, функция возвращает ноль. Эта функция становится доступной только при отключённом автоконтроле ошибок ввода – вывода. Директива компилятора { $I-} отключает, а { $I+} включает автоконтроль. Если автоконтроль отключён и операция ввода – вывода привела к возникновению ошибки, устанавливается флаг ошибки и все последующие обращения к вводу – выводу блокируются, пока не будет вызвана функция IOResult.

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

Функция DiskFree (диск) : Longint. Возвращает объём в байтах свободного пространства на указанном диске. В этой функции «диск» - номер диска:

0 – устройство по умолчанию,

1 – диск А,

2 – диск В и т. д.  

Функция возвращает значение -1, если указан номер несущего диска.

Функция DiskSize (диск): Longint. Возвращает полный объём диска в байтах ( -1, если указан номер несуществующего диска).

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

Read                Write

Readln             Writeln

BlockRead       BlockWrite

Пример. Работа с файлом FIZAP.

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

Внешнее имя abc.dat

Program _abc;

Type ZAP = Record

              FIO : Array [1…10] of Char;

              GOD: integer

              end; {of record}

     F = File;

Var FIZAP: F;

     A, B : ZAP;

     J, I : integer;

begin Assign (FIZAP, `C: \ Pascal \ abc.dat);

     ReWrite (FIZAP, 12);

For Y : = 1 to 3 do

     Begin Write (`=>`);

              For I = 1 to 10 do

              read (B. FIO [I]);

Readln (B. God);

                BlockWrite (FIZAP, B, 1)

end;

close (FIZAP);

Reset (FIZAP, 12);

For J: = 1 to 3 do

begin BlockReadln (FIZAP, A, 1);

     Writeln (J : 2, `-ая запись `, A. FIO, A. GOD: 5);

end

end.

Протокол работы программы:

Иванов 1990

Петров 1989

Сидоров 1990

1 – ая запись Иванов 1990

2 – ая запись Петров 1989

3 – ая запись Сидоров 1990

 

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

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

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

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

 

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

Такой способ доступа называется последовательным.В Турбо – Паскале имеется также возможность организации прямого доступа к компонентам типизированного файла (процедура Seck).

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

Процедура Read (файловая переменная, список ввода).

Обеспечивает чтение очередных компонентов типизированного файла.

Здесь «список ввода» - содержит одну или более переменных такого же типа, что и компоненты файла.

 

Ссылочные типы (указатели)

 










Последнее изменение этой страницы: 2018-05-27; просмотров: 175.

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