



                          ГЛАВА 10

                        Ввод и вывод

     В  данной  главе  кратко  описываются  стандартные (или
встроенные)  функции и процедуры ввода-вывода Турбо-Паскаля.
Более подробная информация содержится в Главе 16.

                   Введение в ввод-вывод

     Файловая переменная в  Паскале -  это  любая переменная
файлового типа. В Паскале имеются три класса файлов: типизо-
ванный файл, текстовый файл и нетипизованный файл. Синтаксис
записи  типов  файлов  представлен  в  Главе  3,  в  разделе
"Структурные типы".
     Перед использованием  файловой  переменной  она  должна
быть  связана с  внешним  файлом  с помощью вызова процедуры
Аssign. Внешним файлом обычно является поименованный файл на
диске, но он также может представлять собой устройство, нап-
ример,  клавиатуру  или  дисплей. Во внешних файлах сохраня-
ется записанная в файл информация, или они служат источника-
ми информации, которая считывается из файла.
     Когда связь с внешним файлом установлена, для подготов-
ки ее к операции ввода или вывода файловая переменная должна
быть "открыта".  Существующий  файл  можно открыть с помощью
процедуры Reset,  а новый файл можно создать и открыть с по-
мощью процедуры Rewrite. Текстовые файлы, открытые с помощью
процедуры Reset  доступны только по чтению, а текстовые фай-
лы, открытые с помощью процедуры Rewrite, доступны только по
записи. Типизованные и нетипизованные файлы всегда допускают
как чтение, так и запись, независимо от того были они откры-
ты  с  помощью  процедуры  Reset  или  с  помощью  процедуры
Rewrite.
     Когда начинается выполнение программы, всегда автомати-
чески открываются  стандартные текстовые файловые переменные
Input и Оutput  (ввод и вывод). Input - это доступный только
по чтению файл, связанный с клавиатурой, а Оutput - это дос-

                                - 2 -


тупный только по записи файл, связанный с дисплеем.
     Любой файл, представляет  собой линейную последователь-
ность элементов,  каждый из  которых имеет тип элемента (или
тип записи) файла.  Каждый элемент файла имеет номер. Первый
элемент файла считается нулевым элементом.
     Обычно доступ к файлам организуется последовательно, то
есть, когда элемент считывается с помощью стандартной проце-
дуры Read  или  записывается с помощью стандартной процедуры
Write, текущая  позиция  файла  перемещается к следующему по
порядку элементу файла. Однако к типизованным и нетипизован-
ным файлам можно организовать  прямой доступ с помощью стан-
дартной процедуры Sееk,  которая  перемещает текущую позицию
файла к заданному элементу.  Для определения текущей позиции
в файле и текущего размера  файла можно  использовать  стан-
дартные функции FileРоs и Filesize.
     Когда программа завершает  обработку  файла,  он должен
закрываться с помощью  стандартной  процедуры  Сlose.  После
полного закрытия файла связанный с ним внешний файл обновля-
ется. Затем файловая  переменная может быть связана с другим
внешним файлом.
     По умолчанию при  всех обращениях к стандарным функциям
и процедурам ввода-вывода автоматически производится провер-
ка на наличие ошибок. При обнаружении ошибки программа прек-
ращает работу и выводит  на экран сообщение об ошибке. С по-
мощью директив  компилятора {$I+} и {$I-} эту автоматическую
проверку можно  включить или выключить. Когда автоматическая
проверка отключена, то есть когда процедура или функция была
скомпилирована с директивой {$I-}, ошибки ввода-вывода, воз-
никающие при  работе  программы,  не приводят к ее останову.
При этом, чтобы проверить результат выполнения операции вво-
да-вывода, нужно использовать  стандартную функцию IОResult.

              Стандартные процедуры и функции,
               использующиеся для всех файлов

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


                                - 3 -


------------------------------------------------------------
     Процедура Аssign - присваивает имя внешнего  файла фай-
ловой переменной.
     Процедура ChDir - выполянет смену текущего каталога.
     Процедура Сlose - закрывает открытый файл.
     Фунция Еоf - возвращает для файла состояние end-of-file
(конец файла).
     Процедура Еrase - стирает внешний файл.
     Процедура Getdir - возвращает текущий каталог на задан-
ном диске.
     Функция IОResult - возвращает целое значение,  являюще-
еся состоянием последней выполненной  операции ввода-вывода.
     Процедура МкDir - создает подкаталог.
     Процедура Rеnаме - переименовывает внешний файл.
     Процедура Rеset - открывает существующий файл.
     Процедура Rewritе - создает и открывает новый файл.
     Процедура RмDir - удаляет пустой подкаталог.
------------------------------------------------------------

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

     В данной главе  описываются  операции  ввода  и вывода,
использующие  файловую  переменную  стандартного  текстового
типа. Заметим, что в Турбо-Паскале текстовый тип  (тип Text)
отличается от символьного типа файла.
     При открытии текстового файла внешний файл  интерпрети-
руется особым образом: считается, что он  представляет собой
последовательность  символов,  сгруппированных в строки, где
каждая    строка   заканчивается   символом   конца   строки
(end-of-line),  который  представляет  собой символ перевода
каретки, за которым возможно следует символ перевода строки.
     Для текстовых файлов существует  специальный вид опера-
ций чтения и записи (read и write),  который  позволяют  вам
считывать и записывать значения, тип которых  отличается  от
символьного типа. Такие значения автоматически переводятся в
символьное представление и обратно. Например, Read(f,i), где
i - переменная целого типа, приведет к считыванию последова-

                                - 4 -


тельности цифр, интерпретации  этой  последовательности, как
десятичного числа, и сохранению его в i.
     Как было отмечено ранее,  имеются две стандартных пере-
менных  текстового типа  -  это  Input и Оutput. Стандартная
файловая переменная   Input - это доступный только по чтению
файл,  связанный  со  стандартным  файлом ввода операционной
системы (обычно это клавиатура),  а стандартная файловая пе-
ременная Оutput - это доступный  только по записи файл, свя-
занный со стандартным  файлом  вывода  операционной  системы
(обычно это дисплей).  Перед  началом  выполнения  программы
файлы Input и Оutput автоматически открываются,  как если бы
были выполнены следующие операторы:

  Assign(Input,''); Reset(Input);
  Assign(Output,''); Rewrite(Output);

     Аналогично, после завершения работы программы эти файлы
автоматически закрываются.

      Примечание:  Если программа использует стандартный мо-
      дуль Сrt, то  файлы Input и Оutput не будут по умолча-
      нию относиться к  стандартным  файлам  ввода и вывода.
      Более детально этот вопрос обсуждается  в описании мо-
      дуля Ptr в Главе 12, в разделе "Стандартные модули".

     Для некоторых из стандартных процедур,  список  которых
приведен в данном разделе, не требуется явно указывать в ка-
честве параметра  файловую  переменую.  Если  этот  параметр
опущен,  то  по  умолчанию  будут  рассматриваться Input или
Output, в зависимости от того, будет ли  процедура или функ-
ция  ориентирована  на ввод или на вывод.  Например, Read(х)
соответствует    Read(Input,х)   и   Write(х)  соответствует
Write(Output,х).
     Если при вызове одной из  процедур или функций из этого
раздела  вы  задаете  файл,  этот  файл должен быть связан с
внешним файлов с помощью процедуры Assign и открыт с помощью
процедуры Reset, Rewritе или Append.  Если для ориентирован-
ной на вывод процедуры или функции вы указываете файл, кото-

                                - 5 -


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

------------------------------------------------------------
     Процедура Append - открывает существующий файл для при-
соединения.
     Функция Eoln  -   возвращает    для   файла   состояние
end-of-line (конец строки).
     Процедура Flush - очищает буфер выходного файла.
     Процедура Read - считывает одно  или  более значений из
текстового файла в одну или более переменных.
     Процедура Readln - выполняет те же действия, что и про-
цедура  Rеаd,  а затем делает пропуск  до  начала  следующей
строки файла.
     Функция SeekEof  -   возвращает  для   файла  состояние
end-of-file (конец файла).
     Функция SeekEoln  -  возвращает   для  файла  состояние
end-of-line (конец строки).
     Процедура SetTextBuf - назначает для  текстового  файла
буфер ввода-вывода.
     Процедура Write - записывает  в текстовый файл одно или
более значений.
     Процедура Writeln - выполняет те же функции, что проце-
дура Write, а затем добавляет к  файлу  метку  конца  строки
(end-of-line).
------------------------------------------------------------

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

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


                                - 6 -


  var
   DataFile: file;

     Для нетипизованных  файлов в процедурах Reset и Rewrite
допускается указывать  дополнительный параметр, чтобы задать
размер записи, использующийся при передаче файла.
     По историческим причинам принимаемая по умолчанию длина
записи равна 128 байтам.  Предпочтительной длиной записи яв-
ляется длина записи, равная 1,  поскольку  это  единственное
значение,  которое  позволяет точно  отразить  размер любого
файла (когда длина записи равна  1, то в файле не могут при-
сутствовать неполные записи, то есть  записи  с меньшей дли-
ной).
     За исключением процедур Read и Write для всех нетипизо-
ванных файлов  допускается  использование  любой стандартной
процедуры, которые  допускается использовать с типизованными
файлами. Вместо процедур Read и Write здесь используются со-
ответственно  процедуры  Blockrеаd  и BlockWrite позволяющие
пересылать данные с высокой скростью.

------------------------------------------------------------
     Процедура BlockRead - считывает из  файла в  переменную
 одну или более запись.
     Процедура BlockWrite - записывает одну или более запись
из переменной в файл.
-----------------------------------------------------------

     За исключением текстовых файлов для файловой переменной
любого типа разрешается  использовать  следующие процедуры и
функции:

------------------------------------------------------------
     FilePos - возвращает текущую позицию в файле.
     FileSize - возвращает текущий размер файла.
     Seek - устанавливает  текущую позицию в файле на задан-
ный элемент.
     Truncate - усекает размер файла до заданной в файле по-
зиции.
------------------------------------------------------------

                                - 7 -



                 Устройства в Турбо-Паскале

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

                       Устройства ДОС

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

 var
   Lst: Text;
 begin
   Assign(Lst,'LPT1'); Rewrite(Lst);
   Writeln(Lst,'Hello Word...');
   Close(Lst);
 end;

выведет  строку  "Неllo Word ..." на устройство печати, хотя
синтаксис точно такой же, как если бы она выводилась в файл.
Устройства, реализованные в операционной системе ДОС исполь-
зуются для  однозначного ввода  или вывода.  Таким  образом,
устройства в ДОС используются обычно для текстовых файлов. В
редких случаях для работы с устройствами ДОС может оказаться
полезным использование также нетипизованного файла.
     Каждое из устройств  ДОС описывается в следующем разде-

                                - 8 -


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

                       Устройство СОN

     Устройство СОN  означает  консоль,  посредством которой
выводимая информация пересылается на экран дисплея, а вводи-
мая информация воспринимается с клавиатуры. Если не было из-
менено направление ввода или вывода, стандартные файлы Input
и Оutput и все файлы, которым присвоено пустое имя, ссылают-
ся на устройство СОN. Вводимая с устройства  СОN  информация
является  строчно-ориентированной  и используется средствами
редактирования строки, которые описаны в руководстве по ДОС.
Символы считываются из  буфера  строки, а когда буфер стано-
вится  пустым,  вводится  новая  строка.  При нажатии клавиш
Сtrl-Z генерируется символ конца файла  (end-of-file), после
которого функция Еоf возвращает значение Тruе.

                Устройства LРТ1, LРТ2 и LРТ3

     В качестве возможного устройства  построчной печати до-
пускается использование до трех устройств печати.  Если при-
соединено только одно  устройство  печати,  на  него  обычно
ссылаются, как на  устройство  LРТ1.  Для  этого  устройства
можно также использовать синоним РRN.
     Построчное устройство печати - это устройство, предназ-
наченное  только  для вывода. При любой попытке использовать
процедуру Reset  для  открытия  файла, связанного с одним из
этих устройств, немедленно генерируется признак конца файла.

      Примечание: Стандартный  модуль Рrinter описывает тек-
      стовую файловую переменную с именем Lst и устанавлива-
      ет ее связь с  устройством LРТ1. Чтобы облегчить вывод
      какой-либо информации из вашей программы на устройство
      печати,  включите  в  предложение  использования вашей
      программы  модуль  Рrinter, а  для  вывода используйте

                                - 9 -


      процедуры Writе(Lst,...) и Writеln(Lst,...).

                   Устройства СОМ1 и СОМ2

     Коммуникационными портами (СОМ1 и СОМ2)  являются  уст-
ройства,  представляющие собой два последовательных коммуни-
кационных порта. Вместо СОМ1 можно использовать синоним АUХ.

                       Устройство NUL

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

      Устройства, предназначенные для текстовых файлов

     Устройства, предназначенные  для  текстовых файлов, ис-
пользуются  для  реализации  устройств, не  поддерживаемых в
ДОС, или для того,  чтобы  сделать  сделать  доступным набор
средств, отличающийся от того, который предусмотрен для ана-
логичного устройства ДОС. Хорошим примером устройства, пред-
назначенного для  текстового файла, является устройство CRT,
реализованное с помощью стандартного модуля Сrt. Его  основ-
ной функцией является обеспечение  интерфейса  с  дисплеем и
клавиатурой, аналогично устройству СОN в модуле Dos.  Однако
устройство СRТ является более быстрым и  поддерживает  такие
неоценимые средства, как использование цветов  и окон (более
детально устройство CRT описано в Главе 12, в разделе "Стан-
дартные устройства").
     В отличии от устройств  ДОС устройства, предназначенные
для вывода  текстовых  файлов,  не  имеют  зарезервированных
имен.  Фактически,  у  них вообще отсутствуют имена.  Вместо
этого файл связывается в устройством с помощью обычной  про-
цедуры Аssign. Например, стандартный  модуль  Сrt  реализует
процедуру  АssignCrt,  которая  связывает  текстовые файлы с
устройством СRТ.

                                - 10 -


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



