К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 18
Текст из файла (страница 18)
упоминали о проблеме взаимодействия человека и машины. И тот и другой учатся понимать партнера иа основании процесса, получившего название «опознание образов». К несчастью, образы, опознание которых легче всего выполняется человеком (зрительные или слуховые), весьма отличаются от тех, которые воспринимает машина (электрические импульсы).
Фактически стоимость физической передачи данных, включающей преобразование образа, присущего человеку, в образ, присущий машине, и обратно, может оказаться сравнимой со стоимостью обработки переданной информации. (Поэтому ведутся исследовании, цель которых путем автоматического или автоматизированного перевода минимизировать стоимость этой передачи.) Задача обеспечения взаимодействия обычно называется «вводом-выводом». Человек вводит свою информацию через вводные устройства (например, клавиатуру, дискетки, устройства ввода с перфолент или магнитных лент и другие терминалы), а получает результаты через выводные устройства (печатающие устройства, те же дискетки и магнитные ленты, графопостроители, звуковые и видеодисплеи) . Все, что общее для них и что определяется каждой конкретной машиной, некоторое множество допустимых символов (см.
гл. 2). Такое множество символов в Паскале определяется через стандартный тип Тех( (см. гл. 9). Необходимо помнить, что каждое из устройств ввода-вывода ориентировано на некоторые соглашения, касающиеся смысла каких-либо символов или их комбинаций. Большинство, например, печатающих устройств ограничивают максимальный размер выводимой строчки. Многие прежние устройства первый символ каждой строчки воспринимают как символ «управления кареткой» н не печатают его. Так можно управлять страницами или требовать надпечатки.
Поэтому, представляя каждое устройство через текстовый файл, всегда нужно помнить о соглашениях, обязательных для этого устройства. !2. Твкпивыв фаолви Ввод и вывод 137 Л С текстовыми файлами можно работать с помощью предописанных файловых процедур Ое1 и Рп(. Это может показаться обременительным, поскольку процедуры предназначены для манипуляций с одним символом. Как пример рассмотрим ситуацию, когда в переменной Х хранится вещественное число и нужно его отпечатать через файл Оп(рп(. Заметим, что образы символов, обозначающих десятичное представление значения, уже совершенно отличаются от обозначения того же значения римскими цифрами (см. программу 4.9). Однако все, что связано с десятичным представлением, благоразумно передавать встроенным, стандартным процедурам преобразования, переводящим абстрактные числа (в каком бы виде 'они ни были представлены в машине) в последовательность десятичных цифр и наоборот.
Поэтому две стандартные предописанные процедуры несколько усложнены, чтобы облегчить анализ и формирование текстовых файлов. !2.!. СТАНДАРТНЫЕ ФАЙЛЫ !Г!РЕ!Т и 013ТР()Т Для представления стандартных устройств ввода-вывода машины (таких, как клавишная панель и видеодисплей) выбраны стандартные текстовые файлы 1прп('и Оп(рп(. Именно они представляют собой главные линии связи человека с машиной. Поскольку эти файлы используются очень часто, то именно их и подразумевают в операциях с текстовыми файлами, если, конечно, не указаны какие-либо явные текстовые файлы.
Таким образом: . Нг(ее(СП) = Нг1ое(Спорое,СП) Оеар(С(!) = ((еад(1прор,СО) йг!Се1п = 'пг!Се1п(Спорое) (!еа01п = кеа41п(1прпо) Ео! = Ео(()прае) Ео1п = Ео1п(!прае) Раде = Раке(Оперпр) (см. раздел 12.4) Если в этих процедурах и функциях параметр-файл не задан, то считается, что к списку параметров как бы должен добавляться файл (прп( или Оц(рп(. Внимпние! эффект от применения предописанных процедур Кезе( или йевт)(е к файлам 1прп( или Оп1рп( зависит от реализации. Таким образом, чтение или запись в любой текстовый файл может проводиться по такой схеме (предполагается, что есть следую- Иа Руководство для вальэаватвля щие описания: уаг Сбп Огаг; В1, Врл Воо1еап, а Р, Я и К вЂ” процедуры, определенные пользователем).
Запись символов в файл Оп1рп1: гереаи гереаФ Р(СЬ); Нг)ое(СЬ) ип111 В1; Иг!Ье1п ипо)1 Вй Чтение символов из файла 1прп1: кЬ11е" поо ео1 6о Ьей)п: ( обработка строчки ) Р; кЬ11е поС ео1п 6о Ьей1п йеад(СЬ); 0(СЬ) еп6; й; йеа61п еп6 с Ниже приведены два примера программ, показывающие, как пользоваться текстовыми. файлами 1прп1 и Оп1рц1. (Разберитесь, какие необходимо провести изменения, если вместо процедур Кеаг) и %г)1е будут использоваться только процедуры Сте1 и Рп1.) ргойгаа ЕеооегГгейиепс)еа(1приЬ,Оиорио); 1 Программа 12Л вЂ” Подсчет частоты встречаемости букв в файле! прот.) Ьуре Иаоига1 = О..йах1по; иаг СЬ. СЬаг; Соиле: аггау (СЬаг) о1 Иаоига1; Ееооега.
Оррег, Еоиег: аео ог СЬаг; Ьей(п Оррег:= ('А','В','С','О','Е','Г','О','Н','1','3','К",'1','М', 12. 3'екитовме файльс Ввод и ввоод 1ЗУ !еааегз:= [оиег + Оррег; !ог СЬ:= 'А' Ьо 'У' 6о Соил![СЬ] :- О; [ог СЬ := 'а' Ьо 'т'. до Соил![СЬ] := О; иЬ! 1е поз Ео! до Ьед[п ип!1е по! Ео1п до ЬеО[п Оеад(СЬ); Иг!Се(СЬ); !! СЬ 1п Еезаегз ЬЬеп Соил![СИ] := Соил![СО] + 1 епд; Оеа61п; Иг!Се1п епд; !Ог СЬ:= 'А' Ьо 'У' до !! СЬ !п Оррег ЬЬеп Иг!Се1п(СЬ, Соил![СЬ]); !ог СЬ := 'а' Ьо 'т' до !! СЬ !п Еоиег ЬЬеп Иг1се1п(СЬ, Соипо[СЬ]); епд Дает в качестве результата: А газ !п Тов'з Ьоизе в!ОЬ! еао Тов'з !се сгеав! (Аг!!Овес!с) Раса ву Ьох ыгЬЬ !!че 6отеп 1!Оиог ]иОз.
ТЬе Ои!сз Ьгоып 1ох ]ивре6 онег ЬЬе 1ату з1еер!пО доО. А 2 0 0 С 0 0 О Е О Г О О 0 Н О 1 0 3 0 К 0 1 О И 0 И О 740 Руководство для пользователя Следуюшая программа копирует 1прп1 на Опьрпь, добавляя в начало каждой строчки ее номер. О Р 0 О 3 Т О ч 'и' х Т 2 д ь 1 С О е 1 К ь 1 3 к 1 и О Р Ц Г 5 ь О х У д О 1 О 0 О 3 о о о о о о в 5 2 5 з 1З г *4 Б 1О 2 г 3 7 4 1О 2 2 6 5 7 5 г' 2 г 2 2 Вь Тввстовыв файлы. Ввод и вывод 141 ргодгав Я661п(1прис, засра!); ! П рограмма 12.2 — В текстовый файл добавляются номера строк. ) суре йасага1 = О..йах1пс; наг Е!пейав: йасига1; Ьей!и !!пение := О; иЬ!1е пос ЕоЕ 6о Ьей!и !!пейив := Е)пейав + 1; Нг11е(Е!пение :4, ' '); иЬ!1е пос Ео1п 6о Ьей!и Нг!Ье(1при11); Оес(1прис) еп6; Оеа61п; Нг!Ье!п еп6 еп6 Дает в качестве результата: 1 А гас 1п Тов'з Ьоизе в!ОЬЬ еаС Тов'з гсе сгеав1 (Аг!ЬЬвео!с) 2 Расх ву Ьох н1ЬЬ 1)не 6огеп 1!Оаог )ийз.
3 ТЬе Оа!са Ьгонп 1ох )ивре6 онег Ейе 1ату а1еер!пй сей. Если файловая переменная !прп1 сопоставлена с входным устройством (таким, например, как клавишная панель), связанным с интерактивным терминалом, то большинство реализаций Паскаля задерживают вычисление буферной переменной !при!'Т до тех пор, пока ее значение явно не потребуется в программе. Использование !прц! Т в выражении либо неявное ее использование при работе с Кеаб, Кеаб!и, ео( или ео!и вызовет ее вычисление (получение с терминала). Хотя в начале программы и выполняется неявное обращение к Кезе1(!прп1), тем не.
менее программа не будет ожидать прихода данных с терминала до тех пор, пока они 142 Руководство для пользователя не будут нужны, например, пока не произойдет обращение за !прил. Если программа дает некоторое сообщение, на которое' пользователь должен ответить, и ответ этот надо прочитать, то чтение ответа должно идти уже после того, как будет записано приглашение (все как в обычной жизни). Приведенный ниже фрагмент программы иллюстрирует процесс выдачи пользователю приглашения через интерактивный терминал: ргоагаа РгоарЬЕхавр1е(1прнЬ,ОнорнЬ); наг Онеэа: 1псеаег; Ье21п ( Здесь идет неявный Канет (! прот) .
) йг!Ье1п('р1еаэе епсег ап )псенег Ьееиееп 1 апд 10.'); Яеад(Сиена) В тех реализациях Паскаля, где задержка вычисления не делается, это приведет к ожиданию или требованию данных еще до записи сообшения, поскольку в начале программы было выполнено неявное обращение к Кезе((!прн(). Задерживается вычисление 1прп(( или нет — определяется при реализации, 12.2. ПРО((ЕДУРЫ КЕАП и КЕАПЬ14 Процедура Кеад уже была определена для текстовых файлов в равд. 9.2. В отличие от обычных процедур она воспринимает разное число параметров, и, кроме того, эти параметры могут относиться и к типу 1п(ецег (или любому диапазону из 1п1едег), и к типу Кеа!.
Пусть Ъ'1, Ч2, ..., Нп обозначают переменные типа О!аг,!п(ецег (либо диапазоны из них) или Кеа!, а à — текстовый файл. Если Г не определено, или находится в режиме просмотра, или ео((Г) дает значение истина ((гпе), то обращение Кеад(г, Ч)— ошибка. 1.
Кеад(Н), ..., Нп) эквивалентно: Кеад(!прн(, Н1, ..., Нп) 2. Кеад(Р, Н1, .... Нп) эквивалентно: Ьея)п Кеад(Р, Н!); ...; Кеад(Р, Чп) епд 3. Кеад!п(Н1, ..., Нп) эквивалентно: Кеад!п(1про1, Н1, , Чп) 4. Кеад!п(Р, Н1, ..., Нп) эквивалентно: Ьея)п Кеад(Р, Н1); ...; Кеад(Р, Чп); Кенжи(Р) епд ВХ Текотооые фаальк Ввод и вывод Из Действие Кеаб!п заключается в том, что после чтении т'п (из ,текстового файла Г) оставшаяся часть текущей строки пропускается. (Однако сами значения У1, ..., Ъ'и могут располагаться и в нескольких строках.) Б.
Если СЬ вЂ” переменная типа Сйаг нли диапазона из Сйаг, то Цеад(Р, СЬ) эквивалентно: ЬеЬнп СЬ:= гт; Сюе((г) епд 6. Если параметр Ч относится к типу !п(едег или же некоторому его диапазону, то Кеаб(Г, Ч) воспринимает последовательность символов, образующую целое число со знаком и, возможно, начальными пробелами. Целое значение, обозначенное такой последовательностью, затем присваивается Ч. 7.