Песни о Паскале - [45]

Шрифт
Интервал

После успешного открытия файла переходят к третьему этапу – собственно чтению из него (чтению книги). С этим вы уже знакомы, поскольку чтение выполняется известной процедурой Readln. Например, прочитать строку из файла можно так:


>      Readln(F, S);


Здесь S – это переменная строкового типа. Обратите внимание: в переменную S попадут только видимые символы строки, а управляющие коды – разделители строк – останутся «за бортом».

Но которая из строк файла будет прочитана? Первая, вторая или иная? При первом вызове после Reset процедура Readln прочтет первую строку файла, при втором – вторую и так далее. Если организовать цикл, то чтение продолжится вплоть до последней строки.

Применительно к чтению файлов говорят о позиции чтения, хотя увидеть эту позицию нельзя. Вызов процедуры Reset устанавливает эту воображаемую позицию в начало первой строки файла. Последующие вызовы процедуры Readln сдвигают её к началу очередной строки.

А что случится после чтения последней строки? Позиция достигнет конца файла, и очередной вызов процедуры Readln вызовет ошибку – событие крайне нежелательное. Чтобы избежать его, надо отслеживать достижение конца файла. Паскаль даёт для этого функцию по имени EOF, что означает End Of File – «конец файла». Булева функция EOF принимает один параметр – файловую переменную, и возвращает TRUE, когда позиция чтения «упирается» в конец файла.


>      if Eof(F)

>      then { достигнут конец файла }

>      else { можно продолжать чтение }


Как видите, функцией EOF нельзя определить позицию чтения (то есть, номер читаемой строки); она сообщает лишь о том, достигнут конец файла или нет.

Что делать с прочитанной книгой? – закрыть и вернуть на полку. Так же поступают и с файлом – закрывают его. Эта операция выполняется процедурой Close – «закрыть».


>      Close(F);


Закрытие файла освобождает память, выделенную для него операционной системой, и снимает блокировку, давая возможность другим программам делать с файлом все что угодно. Закрытие освобождает и саму файловую переменную, – теперь ею можно воспользоваться для доступа к другому файлу.

На рис. 55 показаны этапы чтения данных из файла.



Рис.55 – Четыре этапа чтения из файла
Последовательный доступ к файлу

Как видите, читать текстовый файл можно только последовательно, строку за строкой – от начала к концу файла, – нельзя читать строки в ином порядке. Поэтому текстовые файлы относят к файлам с последовательным доступом. В отличие от них, бинарные файлы (например, файлы баз данных) допускают произвольный доступ.

Впрочем, механизм последовательного доступа не запрещает программисту в любой момент вернуться к началу файла и повторить чтение – достаточно вызвать процедуру Reset.

Самореклама

Теперь испытаем то, что узнали о чтении текстовых файлов. Напишем небольшую программу, выводящую на экран свой собственный исходный текст, вот её первый вариант.


>{ P_25_1 – распечатка текста программы }

>var F: text;       { файловая переменная }

>      S: string;       { строка }

>begin

>      Assign(F, 'P_25_1.pas');       { назначаем собственное имя }

>      Reset(F);       { открываем файл для чтения }

>      repeat

>      if Eof(F) then Break;       { прекратить, если конец файла }

>      Readln(F, S);       { прочитать строку из файла }

>      Writeln(S);       { вывести строку на экран }

>      until false;

>      Close(F);       { закрываем файл }

>      Readln;       { ждать Enter }

>end.


Выделенный курсивом оператор проверяет достижение конца файла, и делает это перед чтением строки. Если же проверять в конце цикла


>      ...

>until Eof(F);


это неизбежно приведет к ошибке после чтения последней строки файла.

Цикл с проверкой в начале

Достижение конца файла надо проверять своевременно! Для этого в Паскале есть подходящий оператор цикла, – пора познакомиться с ним. До сих пор мы обходились двумя циклическими операторами, а именно:

• циклом с проверкой условия в конце REPEAT-UNTIL;

• циклом со счетчиком FOR-TO-DO.

Новый для нас оператор цикла строится из двух ключевых слов, вот его формат:

WHILE <условие> DO <оператор>

По-русски это читается так: "ПОКА условие истинно, ВЫПОЛНЯТЬ оператор такой-то". После ключевого слова DO допускается лишь один оператор, но на практике требуется больше. Потому здесь часто вставляют операторный блок BEGIN-END, в итоге получается такая конструкция.


>WHILE <условие> DO BEGIN

>      <последовательность операторов>

>END


Обратите внимание, что условия продолжения циклов в операторах WHILE-DO и REPEAT-UNTIL взаимно противоположны! Первый из них выполняется, пока условие истинно, а второй – пока оно ложно.

С новым оператором «самораспечатка» станет такой.


>{ P_25_2 – распечатка текста программы }

>var F: text;       { файловая переменная }

>      S: string;       { строковая переменная }

>begin

>      Assign(F, 'P_25_2.pas');       { назначаем собственное имя }

>      Reset(F);       { открываем файл для чтения }

>      while not Eof(F) do begin       { пока не конец файла }

>      Readln(F, S);       { прочитать строку из файла }

>      Writeln(S);       { вывести строку на экран }

>      end;

>      Close(F);       { закрываем файл }


Рекомендуем почитать
Послание в бутылке. Стихи

Данная книга содержит избранные произведения поэтессы за период 2007—2016 гг. Это философская, любовная, пейзажная лирика, проникнутая трепетным отношением к природе, восхищением красотой человеческой души.


Путешествие за счастьем

В далекой сказочной стране живут оборотни и люди, маги и демоны, орки и драконы. И сказки в ней случаются разные - добрые, веселые и даже страшные. А там где есть сказки, там обязательно есть счастье, а там где счастье, там должны быть феи.


Эинсмут: Героев не существует

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Покрывало тьмы

Юмористическое фэнтези. История красавицы и чудовища на новый лад.


Демон и охотник

Знала ли юная Марианна, что кошмарные сны - это часть воспоминаний далекого прошлого. Прошлого, которое предстоит разгадать нашей героине. Ведь неизвестно как, девушка попала совсем другой мир, где сплошь и рядом те, кто не желает ей добра. И, как в сказках, к ней приходит на помощь.... Нет, не прекрасный принц на белом коне, а парень с маской на лице и выразительными изумрудными глазами. Что же ждет нашу героиню в этом мире? Сможет она узнать свое прошлое и принять его или же попытается от него убежать, ведь по пятам идет охотник....


Хранители: Город Сновидений

Шестнадцатилетняя девочка Энни, через книгу, попадает в город Сновидений, в котором происходит невероятная магия Луны. Там она узнает, что относится к необыкновенному роду людей – хранителям, которые защищают и помогают людям. Чтобы вернуться домой ей нужно найти лунный цветок расцветающий раз в сто лет, и который может исполнить любое, но одно желание.