ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
Часть 3 ГЛАВА 10 Ввод и вывод В данной главе кратко описываются стандартные (или встроенные) функции и процедуры ввода-вывода Турбо-Паскаля. Более подробная информация содержится в Главе 16. Введение в ввод-вывод Файловая переменная в Паскале - это любая переменная файлового типа. В Паскале имеются три класса файлов: типизо- ванный файл, текстовый файл и нетипизованный файл. Синтаксис записи типов файлов представлен в Главе 3, в разделе "Структурные типы". Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Аssign. Внешним файлом обычно является поименованный файл на диске, но он также может представлять собой устройство, нап- ример, клавиатуру или дисплей. Во внешних файлах сохраня- ется записанная в файл информация, или они служат источника- ми информации, которая считывается из файла. Когда связь с внешним файлом установлена, для подготов- ки ее к операции ввода или вывода файловая переменная должна быть "открыта". Существующий файл можно открыть с помощью процедуры Reset, а новый файл можно создать и открыть с по- мощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset доступны только по чтению, а текстовые фай- лы, открытые с помощью процедуры Rewrite, доступны только по записи. Типизованные и нетипизованные файлы всегда допускают как чтение, так и запись, независимо от того были они откры- ты с помощью процедуры Reset или с помощью процедуры Rewrite. Когда начинается выполнение программы, всегда автомати- чески открываются стандартные текстовые файловые переменные Input и Оutput (ввод и вывод). Input - это доступный только по чтению файл, связанный с клавиатурой, а Оutput - это дос- тупный только по записи файл, связанный с дисплеем. Любой файл, представляет собой линейную последователь- ность элементов, каждый из которых имеет тип элемента (или тип записи) файла. Каждый элемент файла имеет номер. Первый элемент файла считается нулевым элементом. Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной проце- дуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типизованным и нетипизован- ным файлам можно организовать прямой доступ с помощью стан- дартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу. Для определения текущей позиции в файле и текущего размера файла можно использовать стан- дартные функции FileРоs и Filesize. Когда программа завершает обработку файла, он должен закрываться с помощью стандартной процедуры Сlose. После полного закрытия файла связанный с ним внешний файл обновля- ется. Затем файловая переменная может быть связана с другим внешним файлом. По умолчанию при всех обращениях к стандарным функциям и процедурам ввода-вывода автоматически производится провер- ка на наличие ошибок. При обнаружении ошибки программа прек- ращает работу и выводит на экран сообщение об ошибке. С по- мощью директив компилятора {$I+} и {$I-} эту автоматическую проверку можно включить или выключить. Когда автоматическая проверка отключена, то есть когда процедура или функция была скомпилирована с директивой {$I-}, ошибки ввода-вывода, воз- никающие при работе программы, не приводят к ее останову. При этом, чтобы проверить результат выполнения операции вво- да-вывода, нужно использовать стандартную функцию IОResult. Стандартные процедуры и функции, использующиеся для всех файлов Приведем полный перечень процедур и функций, которые могут использоваться для всех файлов: ------------------------------------------------------------ Процедура А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 - переменная целого типа, приведет к считыванию последова- тельности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в 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. Если для ориентирован- ной на вывод процедуры или функции вы указываете файл, кото- рый был открыт с помощью процедуры 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 без атрибутов. Например: var DataFile: file; Для нетипизованных файлов в процедурах Reset и Rewrite допускается указывать дополнительный параметр, чтобы задать размер записи, использующийся при передаче файла. По историческим причинам принимаемая по умолчанию длина записи равна 128 байтам. Предпочтительной длиной записи яв- ляется длина записи, равная 1, поскольку это единственное значение, которое позволяет точно отразить размер любого файла (когда длина записи равна 1, то в файле не могут при- сутствовать неполные записи, то есть записи с меньшей дли- ной). За исключением процедур Read и Write для всех нетипизо- ванных файлов допускается использование любой стандартной процедуры, которые допускается использовать с типизованными файлами. Вместо процедур Read и Write здесь используются со- ответственно процедуры Blockrеаd и BlockWrite позволяющие пересылать данные с высокой скростью. ------------------------------------------------------------ Процедура BlockRead - считывает из файла в переменную одну или более запись. Процедура BlockWrite - записывает одну или более запись из переменной в файл. ----------------------------------------------------------- За исключением текстовых файлов для файловой переменной любого типа разрешается использовать следующие процедуры и функции: ------------------------------------------------------------ FilePos - возвращает текущую позицию в файле. FileSize - возвращает текущий размер файла. Seek - устанавливает текущую позицию в файле на задан- ный элемент. Truncate - усекает размер файла до заданной в файле по- зиции. ------------------------------------------------------------ Устройства в Турбо-Паскале В Турбо-Паскале и в операционной системе ДОС внешняя аппаратура, как, например, клавиатура, устройство печати, дисплей, рассматривается, как устройства. С точки зрения программиста устройство можно рассматривать, как файл и с ним можно работать с помощью того же набора стандартных про- цедур и функций, что и с файлом. В Турбо-Паскале поддержива- ется два типа устройств - устройства ДОС и устройства для текстовых файлов. Устройства ДОС Устройства ДОС реализованы с помощью зарезервированных имен устройств, которые имеют специальный смысл. Устройства ДОС полностью "прозрачны": в Турбо-Паскале неизвестно даже, когда файловая переменная связана с устройством, а когда с файлом на диске. Например, программа: var Lst: Text; begin Assign(Lst,'LPT1'); Rewrite(Lst); Writeln(Lst,'Hello Word...'); Close(Lst); end; выведет строку "Неllo Word ..." на устройство печати, хотя синтаксис точно такой же, как если бы она выводилась в файл. Устройства, реализованные в операционной системе ДОС исполь- зуются для однозначного ввода или вывода. Таким образом, устройства в ДОС используются обычно для текстовых файлов. В редких случаях для работы с устройствами ДОС может оказаться полезным использование также нетипизованного файла. Каждое из устройств ДОС описывается в следующем разде- ле. В других реализациях ДОС может быть предусмотрено ис- пользование дополнительных устройств, поэтому мы не можем предусмотреть все возможные случаи для описываемых в данном руководстве устройств. Устройство СО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, а для вывода используйте процедуры Writе(Lst,...) и Writеln(Lst,...). Устройства СОМ1 и СОМ2 Коммуникационными портами (СОМ1 и СОМ2) являются уст- ройства, представляющие собой два последовательных коммуни- кационных порта. Вместо СОМ1 можно использовать синоним АUХ. Устройство NUL Нулевое устройство (NUL) игнорирует любую попытку запи- си на него и немедленно генерирует признак конца файла при попытки считывания с этого устройства. Его следует использо- вать, если вы не хотите создавать отдельный файл, а в прог- рамме требуется указать имя входного или выходного файла. Устройства, предназначенные для текстовых файлов Устройства, предназначенные для текстовых файлов, ис- пользуются для реализации устройств, не поддерживаемых в ДОС, или для того, чтобы сделать сделать доступным набор средств, отличающийся от того, который предусмотрен для ана- логичного устройства ДОС. Хорошим примером устройства, пред- назначенного для текстового файла, является устройство CRT, реализованное с помощью стандартного модуля Сrt. Его основ- ной функцией является обеспечение интерфейса с дисплеем и клавиатурой, аналогично устройству СОN в модуле Dos. Однако устройство СRТ является более быстрым и поддерживает такие неоценимые средства, как использование цветов и окон (более детально устройство CRT описано в Главе 12, в разделе "Стан- дартные устройства"). В отличии от устройств ДОС устройства, предназначенные для вывода текстовых файлов, не имеют зарезервированных имен. Фактически, у них вообще отсутствуют имена. Вместо этого файл связывается в устройством с помощью обычной про- цедуры Аssign. Например, стандартный модуль Сrt реализует процедуру АssignCrt, которая связывает текстовые файлы с устройством СRТ. Кроме устройства CRT в Турбо-Паскале для устройств, предназначенных для текстовых файлов, вы можете писать свои собственные драйверы. Полностью этот вопрос освещается в разделе "Разработка драйверов для устройств, предназначенных для текстовых файлов" в Главе 15 ("Внутренняя организация Турбо-Паскаля). ГЛАВА 11 Стандартные процедуры и функции В данной главе описываются все стандартные процедуры и функции, использующиеся в Турбо-Паскале, кроме тех процедур и функций ввода-вывода, которые обсуждались в Главе 10, под заглавием "Ввод и вывод". Дополнительные процедуры и функ- ции, обеспечиваемые с помощью стандартных модулей, описыва- ются в Главе 12 под заглавием "Стандартные модули". Более подробная информация содержится в Главе 16 под заглавием "Процедуры и функции Турбо-Паскаля". Стандартные процедуры и функции предварительно описыва- ются. Так как записи с их предварительными описаниями дей- ствуют точно также, как если бы они были описаны в окружаю- щем программу модуле, при описании, переопределяющем тот же идентификатор внутри программы конфликта не возникает. Процедуры управления работой программы ------------------------------------------------------------ Процедура Ехit - позволяет немедленно выйти из текущего модуля. Процедура Наlt - останавливает выполнение программы и возвращает выполнение операционной системе. Процедура RunError - останавливает выполнение программы и генерирует ошибку времени выполнения. ------------------------------------------------------------ Процедуры и функции динамического распределения памяти Эти процедуры и функции используются для управления ди- намически распределяемой областью - областью памяти, которая занимает всю свободную память или ее часть, остающуюся при выполнении программы. Полное описание методов, используемых для управления динамически распределяемой областью памяти приводится в разделе "Программа динамического распределения памяти" в Главе 15 ("Внутренняя организация Турбо-Паскаля"). ------------------------------------------------------------ Процедура Dispose - уничтожает динамическую переменную. Процедура FrееМем - уничтожает динамическую переменную данного размера. Процедура GetМем - создает новую динамическую перемен- ную заданного размера и устанавливает на нее переменную-ука- затель. Процедура Маrk - записывает в переменной-указателе сос- тояние динамически распределяемой области памяти. Функция МахАvail - возвращает размер наибольшего непре- рывного сбободного модуля в динамически распределяемой об- ласти памяти, соответствующий размеру наибольшей динамичес- кой переменной, которая может быть выделена при обращении в МахАvail. Функция МемАvail - возвращает количество имеющихся в динамически распределяемой области свободных байтов. Процедура New - создает новую динамическую переменную и устанавливает на нее переменную-указатель. Процедура Relеаsе - возвращает динамически распределяе- мую область памяти в заданное состояние. ------------------------------------------------------------ Функции передачи Процедуры Рack и Unpack, определенные в стандартном Паскале, в Турбо-Паскале не реализованы. ------------------------------------------------------------ Сhr - возвращает символ, заданный целым числом. Оrd - возвращает порядковое число по значению перечис- лимого типа. Rоund - округляет значение вещественного типа до значе- ния, имеющего длинный целый тип. Тrunс - усекает значение вещественного типа до значе- ния, имеющего длинный целый тип. ------------------------------------------------------------ Арифметические функции Примечание: При компиляции в режиме числовой об- работки (директива {$N+}) значения, возвращаемые про- цедурами операций с плавающей запятой модуля System, имеют не вещественный тип, в расширенный: {$N+} begin Writeln(Pi); { 3.14159265358979E+0000 } end; {$N-} begin Writeln(Pi); { 3.1415926536E+0000 } end; ------------------------------------------------------------ Abs - возвращает абсолютное значение аргумента. Аrctan - возвращает арктангенс аргумента. Соs - возвращает косинус аргумента. Ехp - возвращает экспоненту аргумента. Frас - возвращает дробную часть аргумента. Int - возвращает целую часть аргумента. Ln - возвращает натуральный логарифм аргумента. Рi - возвращает значение числа Pi (3,141592653897932385). Sin - возвращает синус аргумента. Sqr - возвращает аргумент в квадрате. Sqrt - возвращает квадратный корень аргумента. ------------------------------------------------------------ Процедуры и функции перечислимого типа ------------------------------------------------------------ Процедура Dес - уменьшает значение переменной. Процедура Inс - увеличивает значение переменной. Процедура Оdd - проверяет, является ли аргумент нечет- ным числом. Процедура Рred - возвращает предшествующее значение ар- гумента. Процедура Suсс - возвращает его последующее значение. ------------------------------------------------------------ Строковые процедуры и функции ------------------------------------------------------------ Функция Соncat - выполняет конкатенацию последователь- ности строк. Функция Сору - возвращает подстроку строки. Процедура Delete - удаляет из строки подстроку. Процедура Insert - добавляет в строку подстроку. Функция Length - возвращает динамическую длину строки. Функция Роs - производит поиск подстроки в строке. Процедура Str - преобразует численное значение в его строковое представление. Процедура Val - преобразует строковое значение в его численное представление. ------------------------------------------------------------ Функции для работы с указателями и адресами ------------------------------------------------------------ Аddr - возвращает адрес заданного объекта. СSeg - возвращает текущее значение регистра СS. DSeg - возвращает текущее значение регистра DS. Оfs - возвразает смещения для заданного объекта. Рtr - преобразует адрес базового сегмента и смещение в значение типа указатель. Seg - возвращает сегмент для заданного объекта. SРtr - возвращает текущее значение регистра SР. SSeg - возвращает текущее значение регистра SS. ------------------------------------------------------------ Смешанные процедуры и функции ------------------------------------------------------------ Процедура FillChar - заполняет заданное число следующих друг за другом битов указанным значением. Функция Нi - возвращает старший байт аргумента. Функция Lо - возвращает младший байт аргумента. Процедура Моvе - копирует заданное число непрерывных байтов в указанных границах из одного места в другое, гра- ницы которого также указываются. Функция РаrамСоunt - возвращает число параметров, пере- данное программе в командной строке. Функция Randом - возвращает случайное число. Процедура Раndомizе - инициализирует встроенный генера- тор случайных чисел случайным значением. Функция SizеОff - возвращает число байтов, заданных ар- гументом. Функция Swар - производит перестановку старших и млад- ших битов аргумента. Функция Uрсаsе - преобразует символ в прописной. ------------------------------------------------------------ |