Ввод/вывод

Функции ввода-вывода позволяют работать из ARexx-a с произвольными входными и выходными потоками (файлами, shell-окнами, принтером и т.д.).

Основная функция этой группы - OPEN(), присваивающая логическое имя (т.н. хэндлер) некоторому файлу. Именно это имя используется в функциях типа READLN() или SEEK(). Имя может быть как литеральной строкой, так и одиночным символом. Область его действия ограничивается текущей ARexx-программой.

К базовыми функциями ввода относятся READLN() (чтение строки вплоть до символа "новая строка" - 'Оа'х) и READCH(), которая по умолчанию считывает единственный символ, хотя может быть настроена и для считывания группы символов.

Базовыми функциями вывода являются WRITELN(), записывающая строку в выходной файл и добавляющая к ней символ "конец строки", а также WRITECH(), добавляющая один или несколько символов в выходной файл.

Функция EOF() возвращает булевское значение TRUE, если файл исчерпан; функция SEEK() устанавливает текущую позицию в файле.


OPEN()
res = OPEN(<хэндлер>,<маршрут>[,<опция>])

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

R (read) - открывает существующий файл для чтения. Если "опция" отсутствует, то считается, что файл открывается именно в этом режиме. Указатель позиции в файле устанавливается на его начало.
A (append) - открыть существующий файл в режиме записи; указатель позиции в файле устанавливается на его конец.
W (write) - создать новый файл или "урезать" существующий до нулевой длины; Указатель позиции в файле устанавливается на его начало.

В случае успешного открытия файла возвращается TRUE, в противном случае - FALSE. Неудача работы Ореn() может произойти в режимах 'R' и 'А', если "маршрут" указан неверно или на указанном файле висит замок, установленный другим процессом (в случае "разделяемого замка" (shared lock) можно открывать файл только в режиме 'R' или 'А'). В режиме записи 'W' существующий файл обрезается до нулевой длины безо всякого предупреждения!

Режим открытия файла не влияет на другие функции ввода-вывода. Можно, например, производить чтение из файла открытого c опцией 'W' или 'А', а также записывать данные в файл, открытый с опцией 'R'; следует только всегда учитывать текущее положение указателя позиции файла - например, если он находится на конце файла, то прочитать можно только символ EOF.

На файлы, открытые в режимах записи 'W', навешивается "исключительный замок" (exclusive lock), т.е. никакие другие процессы системы не будут иметь к ним доступ. На файлы, открытые по опции 'R' или 'А', навешивается "разделяемый замок" (shared lock); другие процессы в этом случае могут только читать открытый файл (и ваша ARexx-программа может открывать его многократно).

Параметр "хэндлер" является логическим именем, которое мы присваиваем открытому файлу. Регистр букв в имени не игнорируется и поэтому хэндлер 'OUTPUT' не будет эквивалентен хэндлеру 'Output'. Однако, если вводить "хэндлер" без апострофов, ARexx автоматически будет преобразовывать полученную строку в заглавный регистр до ее использования (т.е. имя хэндлера превращается в переменную ARexx-a!). Разумеется, можно использовать в качестве имени хэндлера и какую-либо из уже имеющихся на момент открытия файла переменных.

Концепция "файла" в ОС Амиги простирается гораздо дальше, нежели файлы в их традиционном понимании. С точки зрения функций ввода-вывода, файлами являются консольные (shell) окна, принтер, параллельный и последовательный порты и т.д. Например, можно открыть "принтер-файл" на запись следующим образом:

if OPEN(printer, 'PRT:', 'W') then
   call writeln(printer, 'Печатаем из ARexx-a!')

Разумеется, попытки прочитать что-либо из принтера заранее обречены на провал. А вот чтение из консольных окон, как из файлов, не представляет никаких проблем и может быть альтернативой использованию PARSE PULL. Для открытия shell-окон используется системное устройство console.device с хэндлером con:

if OPEN(win, 'con:40/40/256/60/Окно', W) then 
   do
     call writeln(win, 'Окошко открыто из ARexx-a!')
     call delay 500
     call close win
   end

Если мы хотим получить список активных хэндлеров, достаточно исполнить функцию SHOW('F'). Кроме файлов, явно открытых по ОPEN(), в полученном списке всегда будут присутствовать два дополнительных имени - STDIN и STDOUT, соответствующие стандартным потокам ввода-вывода. Эти файлы доступны в любой ARexx-программе без какого-либо явного использования ОPEN().

Инструкции SAY и PARSE PULL находятся в близком родстве с функциями WRITELN() и READLN(), но работают со STDOUT и STDIN соответственно (PARSE EXTERNAL работает с файлом STDERR, который открыт при наличии трассировочного консольного окна).


CLOSE()
res = CLOSE(<хэндлер>)

Функция закрывает файл, ассоциированный с "хэндлером". В случае удачного закрытия возвращается TRUE, при неудачном закрытии - FALSE. В любом случае ARexx автоматически закрывает все открытые файлы при выходе из программы (даже в том случае, если выход произошел из-за какого-либо внешнего прерывания).


EOF()
res = EOF(<хэндлер>)

Функция проверяет, находится ли указатель текущей позиции на конце файла; если да, то возвращается TRUE, иначе - FALSE.


LINES()
res = LINES([{STDIN|STDOUT|STDERR}])

Функция возвращает число строк, находящихся в очереди на логическом устройстве, соответствующем указанному аргументу. Аргумент должен относится к интерактивному потоку. Если аргумент не указан, то возвращается число строк на стеке потока STDIN. Эта функция требует наличия в системе shell-хэндлера для ОС 2.0+, либо WShell. Пример:

queue 'cd work:'
say LINES()       ==>   1

READCH()
res = READCH(<хэндлер>[,<длина>])

Функция возвращает строку из файла, ассоциированного с "хэндлером" и содержащую столько символов, сколько указано в параметре "длина" (по умолчанию - 1 символ). Максимальное значени "длины" - 65535. Разумеется, если конец файла будет достигнут ранее, нежели будет считано требуемое число символов, то полученная строка не достигнет требуемой длины.


READLN()
res = READLN(<хэндлер>)

Функция возвращает строку из файла, ассоциированного с "хэндлером" вплоть до символа "перевод строки" ('0а'x). Этот символ не будет включен в возвращаемую функцией строку. Полученная строка в любом случае не может иметь более 1000 символов. Если исходный файл не содержит "переводов строк", то множественный вызов READLN() вернет все содержимое файла "порциями" по 1000 байт.


SEEK()
res = SEEK(<хэндлер>,<смещение>[,<отсчет>])

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

"Отсчет" может принимать следующие значения: 'В' (Begin - начала), 'С' (Current - текущая позиция) и 'Е' (End - конец). Буквы, идентифицирующие "отсчет", разумеется, латинские. Если "отсчет" не указан, то его значение принимается равным 'С'. Если "отсчет" ведется от конца файла (его значением является 'Е'), то "смещение" должно быть отрицательным.

Функция возвращает TRUE, если перемещение указателя на нужную позицию прошло успешно; FALSE возвращается в том случае, если в результате премещения указателя, тот окажется за пределами файла.


WRITECH()
res = WRITECH(<хэндлер>,<строка>)

Функция записывает "строку" в файл, ассоциированный с "хэндлером". Возвращается число фактически записанных в файл символов. В случае успеха это число равно длине "строки".


WRITELN()
res = WRITELN(<хэндлер>,<строка>)

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


Сайт создан в системе uCoz