Работа с непечатными символами

Практически у всех, кто знаком со "взрослыми" языками при знакомстве с QPILE обязательно возникает вопрос: каким образом можно задать в тексте программы на QPILE непечатный символ? Если проводить аналогию с языком С и его вариациями, как написать на QPILE конструкцию

Symbol = '\t'

 

В синтаксисе QPILE такая возможность не заложена. Однако, как обычно, проблему можно решить. И хотя метод не блещет изяществом, работать он будет.

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

Что делать? Единственный легальный и надежный метод - читать эти символы из файла. Все непечатные символы, которые могут понадобиться в программе на QPILE заранее записываются в файл. Лучше это сделать в редакторе, который имеет режим редактирования в 16-ричном (8-ричном) коде. Однажды перечислив в нем все непечатные символы, больше его никогда не касаемся. Далее в портфеле в момент надобности мы читаем этот файл и получаем строку, в которой перечислены все необходимые нам ранее недоступные символы. функция substr() даст нам требуемый, ведь мы же знаем тот порядок, в котором символы были записаны.

Получается, для того, чтобы получить один символ, мы каждый раз должны лазить на диск и читать файл? А если этот символ нужен 100 раз каждую секунду? Тоже не есть проблема - файл можно прочесть один раз на первой итерации портфеля и положить его в глобальную переменную.

PROGRAM

err = 0 

new_global("NonPrintCharacters","");

if NonPrintCharacters == ""

        NonPrintCharacters = read_line("chars.txt",1,err)

end if

.....  все остальное ................. 

END_PROGRAM 

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

SingleNonPrintChar = substr(NonPrintCharacters,Index,1)

где Index - это номер нужного нам символа в прочитанной строке. Вот только перевод строки и символ новой строки не удастся так задать - read_line() их вырежет.

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

Добавить комментарий


Защитный код
Обновить