|
Программируем по-русски
|
Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку. Издатель Глагола
|
(*~\Глагол\Отделы\Поле~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*) (**) ОТДЕЛ Читать; (*============================================================================* * НАЗНАЧЕНИЕ: чтение из потока * * ПРИМЕЧАНИЯ: * * для предварительного чтения используется промежуточная память (ПП), * * которая заполняется заранее * *============================================================================*) ИСПОЛЬЗУЕТ ОБХОД, ОС, Знак ИЗ "..\Иное\"; ПОСТ (* обработка знаков *) знУни- = 0; (* заголовок 0FFH,0FEH *) знВин- = 1; (* по 1251 таблице *) знДос- = 2; (* по 866 таблице *) Размер = 4096; (* размер ПП *) ВИД ДЦепь = ДОСТУП К ЦЕПЬ; ППамять = РЯД Размер ИЗ ОБХОД.Ячейка; Поток- = ДОСТУП К ОписаниеПотока; ОписаниеПотока = НАБОР память:ППамять; (* ячейки ПП *) занято:ЦЕЛ; (* ячеек занятых данными *) выбрано:ЦЕЛ; (* уже выбранных ячеек *) фссылка:ЦЕЛ; (* ссылка на файл в ОС *) фпозиция:ЦЕЛ; (* позиция в файле *) началоСтроки:КЛЮЧ; (* ВКЛ, в начале строки *) видЗнаков+:ЦЕЛ; (* обработка знаков *) КОН; (******************************************************************************) ЗАДАЧА Наполнить(поток:Поток); (* Наполняет ПП потока данными из файла *) УКАЗ поток.занято:=ОС.ЧитатьФ(поток.фссылка,поток.память,Размер); поток.выбрано:=0 КОН Наполнить; (******************************************************************************) ЗАДАЧА Открыть-(имяфайла-:ЦЕПЬ):Поток; (* Открывает новый поток *) ПЕР поток:Поток; фссылка:ЦЕЛ; УКАЗ фссылка:=ОС.ФДляЧтения(имяфайла); ЕСЛИ фссылка = 0 ТО ВОЗВРАТ ПУСТО КОН; СОЗДАТЬ(поток); поток.фссылка:=фссылка; поток.фпозиция:=0; поток.началоСтроки:=ВКЛ; поток.видЗнаков:=знВин; (* будет знУни!! *) Наполнить(поток); ВОЗВРАТ поток КОН Открыть; (******************************************************************************) ЗАДАЧА Закрыть-(поток+:Поток); (* Закрывает поток *) УКАЗ ОС.ЗакрытьФ(поток.фссылка); поток:=ПУСТО КОН Закрыть; (******************************************************************************) ЗАДАЧА Конец-(поток:Поток):КЛЮЧ; (* Возвращает ВКЛ, если в потоке уже окончились данные *) УКАЗ ВОЗВРАТ поток.занято = 0 КОН Конец; (******************************************************************************) ЗАДАЧА Позиция-(поток:Поток):ЦЕЛ; (* Возвращает позицию, отсчитываемую от начала файла *) УКАЗ ВОЗВРАТ поток.фпозиция КОН Позиция; (******************************************************************************) ЗАДАЧА СменаПозиции-(поток:Поток; поз:ЦЕЛ); (* Меняет позицию чтения на <поз>, отсчитываемую от начала файла *) УКАЗ ОС.СменаПозицииФ(поток.фссылка,поз); Наполнить(поток); поток.фпозиция:=поз КОН СменаПозиции; (******************************************************************************) ЗАДАЧА Ячейки-(поток:Поток; память+:ОБХОД.Ячейки; размер:ЦЕЛ); (* Читает в <память> определенное число ячеек. * При невозможности чтения заполняет ячейки нулями *) ПЕР поз:ЦЕЛ; УКАЗ ОТ поз:=0 ДО размер-1 ВЫП ЕСЛИ Конец(поток) ТО память[поз]:=0 ИНАЧЕ память[поз]:=поток.память[поток.выбрано]; УВЕЛИЧИТЬ(поток.выбрано); УВЕЛИЧИТЬ(поток.фпозиция); ЕСЛИ поток.выбрано >= поток.занято ТО Наполнить(поток) КОН КОН КОН КОН Ячейки; (******************************************************************************) ЗАДАЧА БудутЯчейки(поток:Поток; память+:ОБХОД.Ячейки; размер:ЦЕЛ); ПЕР поз:ЦЕЛ; УКАЗ ОТ поз:=0 ДО размер-1 ВЫП память[поз]:=поток.память[поток.выбрано+поз] КОН КОН БудутЯчейки; (******************************************************************************) ЗАДАЧА БудетЗнак-(поток:Поток):ЗНАК; ПЕР знак:ЗНАК; уз:ЯЧЦЕЛ; УКАЗ ЕСЛИ Конец(поток) ТО ВОЗВРАТ 0X КОН; ЕСЛИ поток.видЗнаков = знУни ТО БудутЯчейки(поток,знак,2); ЕСЛИ (поток.фпозиция = 0) И (знак = "#FEFF") ТО Ячейки(поток,знак,2); БудутЯчейки(поток,знак,2) КОН ИНАЧЕ БудутЯчейки(поток,уз,1); ЕСЛИ поток.видЗнаков = знДос ТО знак:=Знак.ИзДос(уз) ИНАЧЕ знак:=Знак.ИзВин(уз) КОН КОН; ВОЗВРАТ знак КОН БудетЗнак; (******************************************************************************) ЗАДАЧА ЗнакЦепи-(поток:Поток):ЗНАК; (* Считывает знак из потока *) ПЕР знак:ЗНАК; уз:ЯЧЦЕЛ; УКАЗ ЕСЛИ поток.видЗнаков = знУни ТО Ячейки(поток,знак,2); ЕСЛИ (поток.фпозиция = 2) И (знак = "#FEFF") ТО Ячейки(поток,знак,2) КОН ИНАЧЕ Ячейки(поток,уз,1); ЕСЛИ поток.видЗнаков = знДос ТО знак:=Знак.ИзДос(уз) ИНАЧЕ знак:=Знак.ИзВин(уз) КОН КОН; ВОЗВРАТ знак КОН ЗнакЦепи; (******************************************************************************) ЗАДАЧА Строка-(поток:Поток; цепь+:ЦЕПЬ); (* Считывает строку знаков из потока в цепочку знаков. При этом * конец строки "#000D#000A" не записывается в конец этой цепочки *) ПЕР занято:ЦЕЛ; знак:ЗНАК; УКАЗ занято:=0; КОЛЬЦО ЕСЛИ (занято >= РАЗМЕР(цепь)) ИЛИ Конец(поток) ТО поток.началоСтроки:=ОТКЛ; ВЫХОД КОН; знак:=ЗнакЦепи(поток); ЕСЛИ знак = 0DX ТО поток.началоСтроки:=ВКЛ; знак:=ЗнакЦепи(поток); (* 0AX *) ВЫХОД АЕСЛИ знак = 0AX ТО поток.началоСтроки:=ВКЛ; ВЫХОД КОН; цепь[занято]:=знак; УВЕЛИЧИТЬ(занято) КОН; ЕСЛИ занято < РАЗМЕР(цепь) ТО цепь[занято]:=0X КОН КОН Строка; (******************************************************************************) ЗАДАЧА ПропуститьСтроку-(поток:Поток); (* Пропускает в потоке строку знаков *) УКАЗ поток.началоСтроки:=ОТКЛ; ПОКА НЕ Конец(поток) ВЫП ЕСЛИ ЗнакЦепи(поток) = 0AX ТО поток.началоСтроки:=ВКЛ; ВОЗВРАТ КОН КОН КОН ПропуститьСтроку; (******************************************************************************) ЗАДАЧА ДлинаЦепь-(поток:Поток):ДЦепь; (* Читает длину цепочки и саму цепочку во вновь распределённую память *) ПЕР длина,поз:ЦЕЛ; дцепь:ДЦепь; УКАЗ Ячейки(поток,длина,4); СОЗДАТЬ(дцепь,длина+1); ОТ поз:=0 ДО длина-1 ВЫП дцепь[поз]:=ЗнакЦепи(поток) КОН; дцепь[длина]:=0X; ВОЗВРАТ дцепь КОН ДлинаЦепь; (******************************************************************************) ЗАДАЧА НачалоСтроки-(поток:Поток):КЛЮЧ; (* Возвращает ВКЛ, если задача Строка или задача ПропуститьСтроку в прошлый раз * прочитали конец строки "#000D#000A" *) УКАЗ ВОЗВРАТ поток.началоСтроки КОН НачалоСтроки; (******************************************************************************) ЗАДАЧА Целое-(поток:Поток; цОтвет+:ШИРЦЕЛ; вОтвет+:ШИРВЕЩ):КЛЮЧ; (* Считывает из потока знаковое представление числа. * Если это представление целого числа, то возвращает ВКЛ и записывает * значение числа в <цОтвет>, иначе возвращает ОТКЛ, а значение записывает * в <вОтвет>. * Следующий за числом знак остаётся в потоке *) ПЕР i,m,n,d,эксп:ЦЕЛ; цифры:ЦЕПЬ[64]; ошибка:КЛЮЧ; мант:ШИРВЕЩ; знакМант,знакЭксп:ЦЕЛ; знак:ЗНАК; (* будущий знак *) (******************************************************************************) ЗАДАЧА ЗнакЦифра(знак:ЗНАК):КЛЮЧ; УКАЗ ЕСЛИ ("0" <= знак) И (знак <= "9") ТО ВОЗВРАТ ВКЛ ИНАЧЕ ВОЗВРАТ ОТКЛ КОН КОН ЗнакЦифра; (******************************************************************************) ЗАДАЧА ЧитатьЗнак; (* Считывает будущий знак из потока *) ПЕР прошлыйЗнак:ЗНАК; УКАЗ прошлыйЗнак:=ЗнакЦепи(поток); знак:=БудетЗнак(поток) КОН ЧитатьЗнак; (******************************************************************************) ЗАДАЧА ДесятьВ(x:ЦЕЛ):ШИРВЕЩ; (* 10 в степени |
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com
|
|