Песни о Паскале - [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 показаны этапы чтения данных из файла.
Как видите, читать текстовый файл можно только последовательно, строку за строкой – от начала к концу файла, – нельзя читать строки в ином порядке. Поэтому текстовые файлы относят к файлам с последовательным доступом. В отличие от них, бинарные файлы (например, файлы баз данных) допускают произвольный доступ.
Впрочем, механизм последовательного доступа не запрещает программисту в любой момент вернуться к началу файла и повторить чтение – достаточно вызвать процедуру 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 гг. Это философская, любовная, пейзажная лирика, проникнутая трепетным отношением к природе, восхищением красотой человеческой души.
В далекой сказочной стране живут оборотни и люди, маги и демоны, орки и драконы. И сказки в ней случаются разные - добрые, веселые и даже страшные. А там где есть сказки, там обязательно есть счастье, а там где счастье, там должны быть феи.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Знала ли юная Марианна, что кошмарные сны - это часть воспоминаний далекого прошлого. Прошлого, которое предстоит разгадать нашей героине. Ведь неизвестно как, девушка попала совсем другой мир, где сплошь и рядом те, кто не желает ей добра. И, как в сказках, к ней приходит на помощь.... Нет, не прекрасный принц на белом коне, а парень с маской на лице и выразительными изумрудными глазами. Что же ждет нашу героиню в этом мире? Сможет она узнать свое прошлое и принять его или же попытается от него убежать, ведь по пятам идет охотник....
Шестнадцатилетняя девочка Энни, через книгу, попадает в город Сновидений, в котором происходит невероятная магия Луны. Там она узнает, что относится к необыкновенному роду людей – хранителям, которые защищают и помогают людям. Чтобы вернуться домой ей нужно найти лунный цветок расцветающий раз в сто лет, и который может исполнить любое, но одно желание.