| Раздел: Turbo Pascal | Автор: [не указан] |
| E-mail: |
Www: [не указан] |
| Просмотров: 3411 | Дата: 15.07.2005 |
Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов: типизованный файл, текстовый файл и нетипизованный файл. Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Аssign. Внешним файлом обычно является поименованный файл на диске, но он также может представлять собой устройство, например, клавиатуру или дисплей. Во внешних файлах сохраняется записанная в файл информация, или они служат источниками информации, которая считывается из файла.
Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть "открыта". Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи. Типизованные и нетипизованные файлы всегда допускают как чтение, так и запись, независимо от того были они открыты с помощью процедуры Reset или с помощью процедуры Rewrite.
Когда начинается выполнение программы, всегда автоматически открываются стандартные текстовые файловые переменные Input и Оutput (ввод и вывод). Input - это доступный только по чтению файл, связанный с клавиатурой, а Оutput - это доступный только по записи файл, связанный с дисплеем.
Любой файл, представляет собой линейную последовательность элементов, каждый из которых имеет тип элемента (или тип записи) файла. Каждый элемент файла имеет номер. Первый элемент файла считается нулевым элементом.
Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной процедуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типизованным и нетипизованным файлам можно организовать прямой доступ с помощью стандартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу. Для определения текущей позиции в файле и текущего размера файла можно использовать стандартные функции FileРоs и Filesize.
Когда программа завершает обработку файла, он должен закрываться с помощью стандартной процедуры Сlose. После полного закрытия файла связанный с ним внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом.
По умолчанию при всех обращениях к стандарным функциям и процедурам ввода-вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение об ошибке. С помощью директив компилятора $I+ и $I- эту автоматическую проверку можно включить или выключить. Когда автоматическая проверка отключена, то есть когда процедура или функция была скомпилирована с директивой $I-, ошибки ввода-вывода, возникающие при работе программы, не приводят к ее останову. При этом, чтобы проверить результат выполнения операции ввода-вывода, нужно использовать стандартную функцию IОResult.
Приведем полный перечень процедур и функций, которые могут использоваться для всех файлов:
В данной главе описываются операции ввода и вывода, использующие файловую переменную стандартного текстового типа. Заметим, что в Турбо-Паскале текстовый тип (тип Text) отличается от символьного типа файла.
При открытии текстового файла внешний файл интерпретируется особым образом: считается, что он представляет собой последовательность символов, сгруппированных в строки, где каждая строка заканчивается символом конца строки (end-of-line), который представляет собой символ перевода каретки, за которым возможно следует символ перевода строки.
Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяют вам считывать и записывать значения, тип которых отличается от символьного типа. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i - переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.
Как было отмечено ранее, имеются две стандартных переменных текстового типа - это Input и Оutput. Стандартная файловая переменная Input - это доступный только по чтению файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput - это доступный только по записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:
Assign(Input,' '); Reset(Input);
Assign(Output,' '); Rewrite(Output);
Аналогично, после завершения работы программы эти файлы автоматически закрываются.
Примечание: Если программа использует стандартный модуль Сrt, то файлы Input и Оutput не будут по умолчанию относиться к стандартным файлам ввода и вывода.
Для некоторых из стандартных процедур, список которых приведен в данном разделе, не требуется явно указывать в качестве параметра файловую переменую. Если этот параметр опущен, то по умолчанию будут рассматриваться Input или Output, в зависимости от того, будет ли процедура или функция ориентирована на ввод или на вывод. Например, Read(х) соответствует Read(Input,х) и Write(х) соответствует Write(Output,х).
Если при вызове одной из процедур или функций из этого раздела вы задаете файл, этот файл должен быть связан с внешним файлов с помощью процедуры Assign и открыт с помощью процедуры Reset, Rewritе или Append. Если для ориентированной на вывод процедуры или функции вы указываете файл, который был открыт с помощью процедуры Reset, то выведется сообщение об ошибке. Аналогично, будет ошибкой задавать для ориентированной на ввод процедуры или функции файл, открытый с помощью процедур Rewrite или Append.
Нетипизованные файлы представляют собой каналы ввода-вывода нижнего уровня, используемые в основном для прямого доступа к любому файлу на диске, независимо от его типа и структуры. Любой нетипизованный файл описывается словом file без атрибутов. Например:
var
DataFile: file;
Для нетипизованных файлов в процедурах Reset и Rewrite допускается указывать дополнительный параметр, чтобы задать размер записи, использующийся при передаче файла.
По историческим причинам принимаемая по умолчанию длина записи равна 128 байтам. Предпочтительной длиной записи является длина записи, равная 1, поскольку это единственное значение, которое позволяет точно отразить размер любого файла (когда длина записи равна 1, то в файле не могут присутствовать неполные записи, то есть записи с меньшей длиной).
За исключением процедур Read и Write для всех нетипизованных файлов допускается использование любой стандартной процедуры, которые допускается использовать с типизованными файлами. Вместо процедур Read и Write здесь используются соответственно процедуры Blockrеаd и BlockWrite позволяющие пересылать данные с высокой скростью.
За исключением текстовых файлов для файловой переменной любого типа разрешается использовать следующие процедуры и функции:
В Турбо-Паскале и в операционной системе ДОС внешняя аппаратура, как, например, клавиатура, устройство печати, дисплей, рассматривается, как устройства. С точки зрения программиста устройство можно рассматривать, как файл и с ним можно работать с помощью того же набора стандартных процедур и функций, что и с файлом. В Турбо-Паскале поддерживается два типа устройств - устройства ДОС и устройства для текстовых файлов.
Устройства ДОС реализованы с помощью зарезервированных имен устройств, которые имеют специальный смысл. Устройства ДОС полностью "прозрачны": в Турбо-Паскале неизвестно даже, когда файловая переменная связана с устройством, а когда с файлом на диске. Например, программа:
var
Lst: Text;
begin
Assign(Lst,'LPT1');
Rewrite(Lst);
Writeln(Lst,'Hello Word...');
Close(Lst);
end;
выведет строку "Неllo Word ..." на устройство печати, хотя синтаксис точно такой же, как если бы она выводилась в файл.
Устройства, реализованные в операционной системе ДОС используются для однозначного ввода или вывода. Таким образом, устройства в ДОС используются обычно для текстовых файлов. В редких случаях для работы с устройствами ДОС может оказаться полезным использование также нетипизованного файла.
Каждое из устройств ДОС описывается в следующем разделе. В других реализациях ДОС может быть предусмотрено использование дополнительных устройств, поэтому мы не можем предусмотреть все возможные случаи для описываемых в данном руководстве устройств.
Устройство СОN означает консоль, посредством которой выводимая информация пересылается на экран дисплея, а вводимая информация воспринимается с клавиатуры. Если не было изменено направление ввода или вывода, стандартные файлы Input и Оutput и все файлы, которым присвоено пустое имя, ссылаются на устройство СОN. Вводимая с устройства СОN информация является строчно-ориентированной и используется средствами редактирования строки, которые описаны в руководстве по ДОС. Символы считываются из буфера строки, а когда буфер становится пустым, вводится новая строка. При нажатии клавиш Сtrl-Z генерируется символ конца файла (end-of-file), после которого функция Еоf возвращает значение Тruе.
В качестве возможного устройства построчной печати допускается использование до трех устройств печати. Если присоединено только одно устройство печати, на него обычно ссылаются, как на устройство LРТ1. Для этого устройства можно также использовать синоним РRN.
Построчное устройство печати - это устройство, предназначенное только для вывода. При любой попытке использовать процедуру Reset для открытия файла, связанного с одним из этих устройств, немедленно генерируется признак конца файла.
Примечание: Стандартный модуль Рrinter описывает текстовую файловую переменную с именем Lst и устанавливает ее связь с устройством LРТ1. Чтобы облегчить вывод какой-либо информации из вашей программы на устройство печати, включите в предложение использования вашей программы модуль Рrinter, а для вывода используйте процедуры Writе(Lst,...) и Writеln(Lst,...).
Коммуникационными портами (СОМ1 и СОМ2) являются устройства, представляющие собой два последовательных коммуникационных порта. Вместо СОМ1 можно использовать синоним АUХ.
Нулевое устройство (NUL) игнорирует любую попытку записи на него и немедленно генерирует признак конца файла при попытки считывания с этого устройства. Его следует использовать, если вы не хотите создавать отдельный файл, а в программе требуется указать имя входного или выходного файла.
Устройства, предназначенные для текстовых файлов, используются для реализации устройств, не поддерживаемых в ДОС, или для того, чтобы сделать сделать доступным набор средств, отличающийся от того, который предусмотрен для аналогичного устройства ДОС. Хорошим примером устройства, предназначенного для текстового файла, является устройство CRT, реализованное с помощью стандартного модуля Сrt. Его основной функцией является обеспечение интерфейса с дисплеем и клавиатурой, аналогично устройству СОN в модуле Dos. Однако устройство СRТ является более быстрым и поддерживает такие неоценимые средства, как использование цветов и окон.
В отличии от устройств ДОС устройства, предназначенные для вывода текстовых файлов, не имеют зарезервированных имен. Фактически, у них вообще отсутствуют имена. Вместо этого файл связывается в устройством с помощью обычной процедуры Аssign. Например, стандартный модуль Сrt реализует процедуру АssignCrt, которая связывает текстовые файлы с устройством СRТ.
Кроме устройства CRT в Турбо-Паскале для устройств, предназначенных для текстовых файлов, вы можете писать свои собственные драйверы.