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