К. Йенсен, Н. Вирт - Паскаль - Руководство для пользователя (1109480), страница 13
Текст из файла (страница 13)
В Паскале слово «файл» относится к объектам, образованным последовательностью компонент, причем все они одного типа. Особые файлы, состоящие из строчек символов переменной длины, называютси текстовыми файлами. Они лежат в основе всех механизмов взаимодействия человека с вычислительной системой. 9Л. СТРУКТУРА ФАЙЛА Сама последовательность устанавливает естественный порядок компонент, причем в любой момент непосредственно доступна только одна компонента.
Другие компоненты становятся доступными по мере продвижения по файлу. Число компонент, называемое длиной файла, в определении файлового типа не фиксируется. Эта особенность явно отличает понятие файла от понятия массива. Если файл не имеет компонент, его называют пустым. Таким образом, объекты файлового типа отличаются и от объектов массивового, и записного, и множественного типов тем, что они представляют собою структуру с последовательным доступом к компонентам одного типа. Рис. 9П.
Синтаксическая диаграмма для Фаиловогв типа Описание каждой переменной-файла Е автоматически вводит некоторую буферную переменную, обозначаемую через ГТ Эта "переменная относится к типу компонент файла. Буферную пере- Уб Рукоаодщао дяя пользователя менную можно рассматривать как некоторое окно, через которое можно либо посмотреть (прочитать) на сушествующие компонен ты, либо добавить (записать) новые компоненты. Окно автоматически передвигается при некоторых из операций над файлом. Всей файловой переменной присваивание делать нельзя.
Вместо этого надо добавлять через буферную переменную по одной компоненте, т. е. действовать строго последовательным образом. Если файл находится в положении «за последней его компоиентойэ, то значение буферной переменной не определено. Рис. 9.2. Синтаксическая диаграмма дяя Буферной переяенной Последовательный характер обработки и наличие буферной переменной предполагают, что файлы могут ассоциироваться с внешней (вторичной) памятью и другим периферийным оборудованием. Как хранятся компоненты, зависит от реализации, мы лишь допускаем, что только некоторые из них находятся в какой-то момент в основной памяти, а непосредственно доступна только компонента, на которую указывает Г).
Если буферная переменная Г'( дойдет до конца файла Г, то предописанная логическая функция со((Г) станет давать значение (гне, в других случаях она дает значение (а|бе. Для работы с файлами предусмотрены такие процедуры: готовит файл для просмотра (чтения), помещая окно и начало файла.
Если файл не пустой, то значение первой компоненты Е приснаиаается Е(, а функция ео((Е) начинает давать значение (а!ае готовит файл для формироаания (записи). Значение Е заменяется на пустой файл. Функция ео((Е) начинает дааать значение (гце, и можно ззписыиать новый файл передзигасг окно файла на следующую компоненту и прнсиаизает значение этой компоненты буферной переменной Е). Еспи следующей компоненты нет, то ео! (Е) начинает давать значение !гце, а Е! становится неопределенной. Если перед обращением к Сгег(Е) значение ео((Е) было (гне ияи файл находился а режиме формирования,то обращение считастсн ошибкой добавляет значение буферной переменной Е) к файлу.
Обращение будет ошибкой, если перед ним предикат ео((Е) не сТановится (гое. После добавления ео((Р) остаегся !гце, а значение Р! не определено. Еспи файл н режиме просмотра, то обращение — ошибка. )(езе(()г) Пещи(е(Е) Сге((Е) Рц((!.) 9. Файловьа гиви 97 Б принципе все действия по формированию и просмотру последовательных файлов можно полностью выразить с помощью этих четырех примитивных операций с файлами и предиката ео((Г). Однако на практике естественнее объединять продвижение по файлу с обращением к буферной переменной.
Поэтому мы вводим такйе две процедуры: Кеаг) и %гйе. Обращение Кеаб(Г, Х), где Х вЂ” переменная, эквивалентно: Ьеа!и Х:= Е1; Сей(Е) еп6 Обращение %п1е(Г, Е), где Š— выражение, эквивалентно: Ьей!п ЕТ := Е; Рпй(Е) еп6 Фактически Кеаб и %гйе в некотором роде специальйые процедуры. Они приспособлены для работы с различным числом параметров (Ъ'1, ...
Ъп — переменные; Е1, ..., Еп — выражения). Обращение Кеаб(Г, Н, ..., Ъ'и) эквивалентно оператору Ьен(п Кеаб(Г, Ъ'1); ...;Кеаб(Г, ЪЕп) епб а обращение %гйе(Г, Е!, ..., Еп) эквивалентно оператору Ьеачп %гйе(Г, Е1); ...;%гйе(Г, Еп) епд Преимущество использования таких процедур связано не только с их краткостью, но и с концептуальной простотой, так как мы можем игнорировать существование буфера ГТ, значение которого бывает и неопределенным. Однако буфер порой бывает полезным ~для «заглядывания вперед». Ориисры описаний: ваг Вайа: Т! 1е о! 1пйеяег; Еп 1пйеаег; еаг Р1ойТ!1е: Т!!е ог гесог6 С: Со1ог; Сеп: йайпга! еп6; еаг С1пЬ: Т!1е о! Регаоп; Р: Регаоп; 9В Руководство йлл тюльзовотелл е)римеры действий с файлами: А .= Оеез(; Сее(0зеа! Резо(0а(а,А! Р!оФ!!!е! С .= Под( Р1оФ!1!е!.!еп =.11; Ри((Р1оФ!т!е> С!иЬ1:= Р; РиФ<С!иЬ! Ит!Фе(С!иЬ,Р] Файлы могут быть локальными по отношению к программе (или процедуре), однако они могут существовать и вне программы.
Такие файлЫ называются внешними. Внешние файлы передаются как параметры в программу. Этн параметры перечисляются в заголовке программы (см. Сл. 3). Ниже приведены две программы, обрабатывающие файлы. Программа 9.1 имеет дело с файлом вещественных чисел, представляющих собой результаты измерений, выполненных каким-то инструментдЬ! либо другой программой. Программа же 9.2 работает с двумя файлами, где перечислены упорядоченные по «последнему» имени сотрудники; г(, Г2, ..., Ргп и (л(, Ст2, ..., Пп причем Г (1+!') =- г'(1) н Й(3+ 1) ) = П(3) для всех 1,,). Программа сливает зти два файла в один — Н, так что Н(К+ 1) о= Н(К) для К= 1, 2, ..., (М+ (Х( — !).
ргоетев Иогве1!зе(0еоз1п, ОзФеОиФ); ( Программа 0.1 — Нормализация файле с изменениями: вещественными числами, полученными из внешнего источника. ) Фуре МеззитевепФз = !11е о! Иез1; ИзФиГЬ! = О..Мзх1пФ; нет Ое(е1п, ОеозОиФ: Меззитевептз; 3ив, Мееп, БивО(Зциегез, ЗФепдзгООен!зФ!оп: Иее1; И: ИеФиге1; Ьеа(п 9. Фааытвые типы 99 Неаео(0аФа1п); И:= О; Зов := 0.0; ЗивО!Зциагеа := 0.0; нЬ!!е поФ ео1(0аоа1п) до ЬеВ!и И := И + 1; Зив:= Зив + Оаса1п(; Зив01Зциагеа:= Зив01Зциагеа + Зцг(0аоа1п1); СеФ(0аоа1п) епо;- Иеап:= Иеап / И; ЗФапдагдОен!аФ1оп := ЗцгФ( (ЗивО!Зциагеа / И) — Зцг(Иеап) ); Неаео(0аоа1п); Веиг!Фе(0аФаОиФ); иЬ!1е поФ Ео1(0аФа1п) до ЬеВтп ОасаОиФ1:= (ОаФа1п1 — Иеао) / ЗФапдаг00еч!аФ!оп; РиФ(0асаОиФ); Сео(0аса1п) епд епд ( Иогва1гае ).
ргоВгав ИегВеГ!1еа(Г,С,Н); [ Программа 9.2 — Слияние файлов Г и б, отсортированных ло последним именам.1 Фуре Иасига1 = О..Нах1пФ; ЗФг!п015 = расаед аггау [! .15) о( СЬаг; Регаоп = гасетом Иаве: гесогО Г!гаФ, [ааФ: ЗФг!п015; епд; Не!ВЬФ: Иасига1 (сантиметры ) епо; наг Г, С, Н: 1т1е о! Регаоп; ЕпОГС: Воо1еап; ЬеВ!и Неве!(Г); Неаео(С); Неиг!Фе(Н); ЕпдГС := Ео((Г) ог Ео((С); ЮО Руководство для пользователя нйп!е псе ЕпбГС до Ьей!п з! ГТ.Неве.(аз! < СТ.Нане.(азЬ ЬЬеп Ье61п НТ := ГТ; СеЬ(Г); ЕпбГС := Ео((Г) епб е1зе Ьеа!п НТ := СТ", Сей(6); ЕпбГС := Ео((6) епд; Рнс(Н) епб; нЕц1е поС Ео((6) бо Ьеа1п Нг!Ье(Н, СТ); Се!(6) епд; нЬ!1е поС Ео((Г) до Ьей!и Нгз(е(Н, ГТ); СеЬ(Г) впав епд 9.2. ТЕКСТОВЫЕ ФАЙЛЫ Ут'г!!сн! (Р) Т(еагпп (Р) Ео!п(Е) заКан ещаст тскущую строку (строчку) текстового файла !.
аропускает асс ло начала следующей строки текстового файла Р (ЕТ становится первым символом слепую щей строки ) логическая функции, указывающая, достигнут ли конец текущей строки в файле Е. (Если !гне, то РТ соответствует положению разлслителн строк, на значение ЕТ вЂ” пробел.) Если Š— текстовой файл, а СТ! — символьная переменная, то можно пользоваться такими сокращениями: Текстовыми называются файлы, состоящие из последовательности символов, разбитой на строки произвольной длины. Для описания таких файлов используется предопределенный тип Тех(. Мы можем считать, что тип Тех1 определен на базе типа СТ!аг, дополненного (гипотетическим) символом окончания строчки или маркером конца строки.
Поэтому тип Тех! не эквивалентен (упакованному) файлу из символов. Маркер конца строки может распознаваться и формироваться такими специальными текстовыми процедурами: 9. Фа "лолые типы 101 Сонрангенная форма Полная форма Р(:-- СЬ; Р. г(Р) СЬ: Р(; СеЦГ) тЧГ!1е(1г. СЬ) йеаг((Гч СЬ) йенгаЬе(У); гереаС гереаЬ Р(С); Нг1те(У.С) нпЬ11 В1; Нг(ое1п(У) нпЬ(1 В2 2.
Чтение тскстового файла Х. Предположим, что с гюмощью (,г(С) обрабатывается (очередной) символ С, а через К обозначено действие, которое надо выполнить, встретив конец строки. резей(Х); нЬ11е пот ео1(Х) до Ьей(п нЬ11е пот ео1п(Х) оо Ьей(п йеао(Х,С); ()(С) епо; й; йеао1п(Х) епо' 3. Копирование текстового файла Х в аналогичный файл У с сохранением строчной структуры файла Х.
Имена (прн( и Он(рц1 выделены для двух стандартных переменных, представляющих собою текстовые файлы. Они используются в качестве параметров программы и обеспечивают чтение и запись текстов. Более детально о них пойдет речь в гл. 12, где будут описаны расширенные обращения к процедурам )театр, Юг((е, Кеаг)1п и %г((е!п. В приведенных ниже схемах программ мы воспользуемся упомянутьгми соглашениями и продемонстрируем некоторые из типичных работ с файлами.
1. гРормированис текстового файла У. 11редположим, с помощью Р(С) вычисляется очередной символ и присваивается параметру С. Если нужно закончить текущую строчку, то логическая переменная В! принимает значение (гпе, если нужно закончить весь текст, то В2 — 1гне. 102 Ррлооодетео длл оолоэооателл Кеаес(Х); Йеиг1$е(У); ИЬ11е пес ео((Х) Но Ьеа(п ( сору а 1(пе ) ип(1е пос ео1п(Х) 4о Ьеп1п йеад(Х,С); Нг(се(У,С) епо; йеаа)п(Х); Игеее1п(У) епд Замечание о реализации. Кодирование (представление) маркера конца строки обычно связано с использованием управляющих символов.