Практикум по среде и языку QBasic________________________159

'вывод адреса и номера страницы

END IF 'конец условного оператора ЬЬЬ% = ЬЬ% 'прошлый стал позапрошлым ЬЬ% = ASC(byte) 'текущий стал прошлым LOOP UNTIL EOF(l) 'конец цикла чтения PRINT " eof", i& - 1 'вывод количества байтов CLOSE #1 'закрытие файла

Эта программа отличается от предыдущей прежде всего оператором цикла. Ввиду большого объема файла информации тип переменной номера читаемого байта должен быть LONG. Хотя количество байтов в файле нам известно, здесь в целях обучения применен оператор цикла другого вида с использованием признака конца файла для окончания цикла чтения. Поиск заголовка страницы производится при помощи строковой переменной EGA$, которая образуется из символов, соответствующих текущему, прошлому и позапрошлому байтам. По совпадению этой переменной с началом текста заголовка страницы производится чтение номера страницы и его вывод вместе с адресом начала предполагаемого начала заголовка страницы. После выхода из цикла выводится количество байтов в файле.

По приведенному тексту вывода на экран видно, что анализируемый файл содержит 5 кодовых страниц. Номера кодовых страниц соответствуют данным описания этого файла: 437 - США, 850 - латинская I, 852 - латинская II, 855 - кириллица I, 866 - русская (кириллица 11). Предпоследняя строка выводится из-за наличия искомого слова в конце файла текста, заявляющего об авторских правах фирмы Microsoft на этот файл, и полученный номер не соответствует никакой кодовой странице (это вы еще увидите).

34 437 9814 850 19594 852 29374 855 39154 866 48950 24640 eof 49090

Казалось бы все уже ясно, ан нет: не торопитесь праздновать победу. Разности адресов составляют 9780, что при делении на 256 (а именно столько символов должно быть в кодовой странице) получается 38 (столько байтов отводится на кодирование одного символа) и 52 в остатке (столько байтов отводится на заголовок). И того, и другого многовато. В заголовке страницы было 32 байта, а на кодирование каждого символа отводилось по 16 байтов. Откуда излишки? Все дело в том, что каждая из кодовых страниц содержит по 3 фонта с размерами 8Х16, 8Х14 и 8Х8. Поскольку 16 + 14 + 8 = 38, по содержимому страницы все сошлось. А по заголовкам тоже должно быть понятно: решением нехитрой арифметической задачи получаем, что на заголовок собственно страницы отведено 22 байта, а на подзаголовки каждого из фонтов по 10.