Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Самоучитель игры на Паскале. АВС и немного Турбо

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
Глава 10.
Файлы
Коротенько. Почему это очень важно
А действительно, кто такие файлы, и почему они нам так важны (а они действительно так важны)? Вам не казалось, что программы наши носят несколько эфемерный характер? Ну отработала программа, и что осталось после неё? Всё прошло, всё забыто, всё начинать по новой. При этом любая игрушка после запуска не на предлагает восстановить прежнее состоян таблицу рекордов. Многие программы изначально заточены на обработку внешних данных, тот же Word или Photoshop. Да тот же Паскаль, в конце концов, не заставляет ведь каждый раз набирать программу сначала. Помнит он её где-то. Помнит он её конечно, в файле. Я говорил уж программирования – файл. От других понятий файл отличается тем, что он вещь реальная, существующая независимо от нашей программы. Реальная, разумеется, в компьютерном смысле слова, но уж в этом-то смысле реальная безусловно – программа работать закончила, а файл остался. Вот о них-то, о файлах, мы сейчас и пог И о главном – файлы бывают текстовые и бинарные. На самом деле, все они, разумеется, бинарные, но разделение такое общепринято и вполне осмысленно.
переменная, массив, указатель. К ним добавляется и
оворим.
Найти и снова найти
чинает жизнь сначала, а
ие, или, по крайне мере, ведёт
е о важнейших понятиях
Но начнём мы не с того, что у файлов внутри а, так сказать, с виду сверху. Файл, как уже сказан есть, но их много. Отсюда вопр их много? Ещё более другими словами – как узнать, какие файлы существуют? На этот вопрос немедленно возникает вопрос встречный – а где существуют? Упрощаем вопрос - как узнать, какие файлы существуют в каталоге, из которого запущена наша программа?
о, вещь реальная. Или он есть, или его нет. Или он
ос – как узнать - есть он, или его нет, или
191
Узнать несложно, но, как это помягче выразиться – методом немного корявым. Сначала объявляем переменную типа SearcRec
var SR : SearchRec;
SearchRec – запись, а записи у нас по плану в следующей главе. Так что не
обращаем внимания и делаем вид, что всё понимаем. На самом деле, записи - это очень просто. Вот только доберёмся до следующей глав А вот и сама программа целиком (обратите внимание – добавленный в
uses модуль Utils):
program FindF;
uses
Crt, Utils; var SR : SearchRec; rez : boolean;
begin rez:=FindFirstFile( '*.*', SR);
while rez do begin Writeln( SR.name); rez:=FindNext(SR); end;
FindClose(SR); end.
На выходе получаем список файлов, расположенных в текущем каталоге (из которого запущена программа).
Почитайте в справочной системе описание структуры SearchRec. В ней присутствует и другая пол очень незначительном коли
езная информации, хотя, по правде говоря, в
честве.
ы
192
Обратите внимание, что команда поиска файлов используется в двух вариантах. Первый раз – в полной – FindFirstFile. Второй и следующий в сокращённой – FindNext. Подразумевается, что первые два параметра из FindFirst незримо присутствуют в FindNext с теми же значениями. И то и другое – функции, возвращаемый результат булевский, означает нашли что-то заказанное или нет. Бессмысленный оператор FindClose но завершает цикл поиска, освобожд Ну и ещё обратите внимание на организацию цикла while. У нас есть некоторое действие (Find), в зависимости от результата которого выполнение цикла может быть прекращено. И есть обработка результатов этого действия (вывод имени файла, в данном случае). Первый Find производится перед циклом. А в цикле всё идё порядке – сн
Запустите Блокнот. Напишите в нём какую-нибудь ерунду. Сохраните. Запустите Фар, Тотал Коммандер, Проводник, или что-нибудь аналогичное. Полюбуйтесь на созданный файл. Существует? Безусловно. Расширение у файла будет .txt. Такой файл называется текстовым – не по расширение, и даже не потому, что Проводник обозвал его Текстовым документом, а пото
Более формализовано – текстовый файл содержит символы с кодами от какого-то значения до какого-то значения (я, естественно, этих значений не помню), в число которых (символов) как раз и попад буковки, циферки и тому подобные видимые символы. Из невидимых символов в каретки с кодом 13 и перевод строки с кодом 10. Все эти ужасы со странными именами – наследие давно забытых дней. Просто примите как данность. Встречаются в природе и неправильные текстовые файлы, у которых переход на новую строк остально
ачала обработка, затем действие. Это типично.
Файлы текстовые и никому не нужные
му что он содержит только текст.
правильных текстовых файлах присутствуют ещё возврат
у кодируется по-другому. Иногда попадаются в
м правильные файлы, у которых в самом конце присутствует
ая память.
сит ритуальный характер и
т в обратном
тому, что у него такое
ают
193
признак конца файла. Не обращайте внимания, если не собираетесь писать свой собственный текстовый редактор. И ещё – не всё, что выглядит как текст, является текстовым файлом. Документ Word’а выглядит вполне текстово, но к текстовым файлам не относится. И совсем напоследок. То, о чём мы говорим, в смысле, не сам файл, а его
ержимое, по-английски обычно называ
сод
Хотя текстовые файлы сами по себе большого интереса (для программиста) не представляют и большой пользы не приносят, тем не менее техника работы с ними очень похожа на технику работы с бинарными файлами. А вообще, и то, и другое, очень просто, как и всё в Паскале. Объявл
var
Txt : Text;
Работаем с ним – создаём новый файл и запи правило, во всех языках работа с файлом делится на три этапа – открыть файл, сделать что-то с его содержимым, закрыть файл.
Комментируем. Открытие фа объявленную в программе файлов файлом на диске – уже существующим или тем, которого ещё нет, но
яем текстовый файл:
{открыть файл}
Assign( Txt, ‘a.txt’);
ReWrite(Txt);
{записать что-то в файл}
Writeln( Txt, ‘12345’);
Writeln( Txt, ‘67890’);
{закрыть файл}
Close(Txt);
йла в Паскале выполняется в два этапа. Assign связывает
ется plaint text.
сываем в него текст. Как
ую переменную Txt с физическим
194
который будет создан в процессе выполнения программы. Имя может включать в себя и путь, то есть файл может быть открыт и в другом каталоге. Разумеется, расширение файла не обязательно будет .txt. Немного другими словами – у нас есть переменная. Тип этой переменной – не целое, не строка. Тип её – текстовый файл. Переменная существует, как и любая переменная, только и только в пределах и во время выполнения на важности и новизны – соответствует реальный объект реального мира – файл. Ну, естественно, если Вы верите в реальное существование файла…
А появится наш файл в каталоге Чего-то там:\PABCWork. Я проверял. А
и надо в другом мес
есл модули – Модули для создания заданий – Utils. Дальше вы сами найдёте, ведь правда?
Запись в текстовый файл поразительно напоминает вывод на экран. Только в скобках появился дополнительный, первый параметр – имя файловой переменной. Обратите внимание – не имя реального файла (того, что на диске), а имя переменной. Ещ уже поняли, а я всё долблю, как дятел. Точно так же, как и на экран, можно выводить в текстовый файл и значения переменных.
Writeln( Txt, int:5, ‘ ‘, float:8:3, ‘ ‘, stroka);
Закрытие фа
Теперь чтение. S – строковая переменная. Имеем почти то же самое, что и для записи:
{отк
Assign( Txt, ‘a.txt’);
ReSet(Txt);
{прочитать что-то из файла}
Readln( Txt, s);
{закрыть файл}
шей программы. Assign выполняет действие небывалой
указывает, что нашей эфемерной переменой
те? Помощь – Содержание - Стандартные
ё раз извиняюсь, если Вы давно
йла вопросов не вызывает (надеюсь).
рыть файл}
195
Close(Txt);
Только ReWrite поменялся на ReSet, и вместо Writeln написан Readln, почти точно такой же, как и знакомый Readln из текстового режима – только добавилось имя файла (повторюсь – имя файловой переменной).
В качестве самостоятельного упражнения модернизируйте программу из предыдущего раздела. Пусть она выводит список файлов не на экран, а в текстовый файл. Имя файла запросить. Через каж вставлять пустую строку. В конце списка вывести общее число
Уже модернизировали? Вот и славно. А теперь ещё упражнение. Вернёмся к нашим крестикам-ноликам. Хочу, чтобы после завершения игры, результат (кто кого победил), записывался в текстовый файл. Если файла нет, он должен быть создан. Если файл есть, новый результат дописать ему в хвост. А как это, дописать в хвост? У есть счастливая возможность – кроме ReSet и ReWrite их также можно открыть командой Append. После этого все новые записи в файл будут приклеиваться к уже имеющемуся в файле. Проверку, существует ли файл, производим с помощью FindFirst .
Первый вариант:
procedure Finale( result : integer); const
ftxtname = 'ktokogo.txt'; var Txt : Text; SR
begin {тут то, что вы уже понаписали. С фейерверком, надеюсь}
if FindFirst( ftxtname, SR) then begin {файл есть} Assign( Txt, ftxtname); Append(Txt); if result = 1 then Writeln( Txt, 'You Win!'); if result = 2 then Writeln( Txt, 'You Lost!');
: SearchRec;
дые десять строк
файлов.
текстовых файлов
196
if result = 3 then Writeln( Txt, 'Draw'); Close(Txt);
end else begin {файла нет}
Assign( Txt, ftxtname); ReWrite( Txt); if result = 1 then Writeln( Txt, 'You Win!'); if result = 2 then Writeln( Txt, 'You Lost!'); if result = 3 then Writeln( Txt, 'Draw'); Close(Txt); end;
Ни в коем случае не являясь сторонником утаптывания текстов программ до минимально возможного размера, тем не менее должен заметить, что меня не очень радуют монотонно повторяющиеся строки с Writeln. А не вынести ли их нам в отд
Вариант улучшенный:
procedure Finale( result : integer); const
ftxtname = 'ktokogo.txt'; var Txt : Text; SR : SearchRec;
{..........................................................}
procedure WriteResult( var Txt : Text; result : integer);
begin
if result = 1 then Writeln( Txt, 'You Win!'); if result = 2 then Writeln( Txt, 'You Lost!'); if result = 3 then Writeln( Txt, 'Draw'); end;
{..........................................................}
begin {тут фейерверк}
ельную процедуру? И вынесем!
197
if FindFirst( ftxtname, SR);then begin Assign( Txt, ftxtname); Append(Txt); WriteResult( Txt, result); Close(Txt);
end else begin
Assign( Txt, ftxtname); ReWrite( Txt); WriteResult( Txt, result); Close(Txt); end; end;
Комментарии. В процедуру передаются в качестве параметров файл и результат. Это правильно. Пользоваться изнутри процедуры внешними переменными нехорошо. Глобальные переменные – зло. Передаётся в процедуру не имя файла, а сам файл. Подумайте (опять) об этом. Файл передаётся с var, хотя сам файл не меняется, меняться будет его содержимое. Думать об этом не надо. Ес нормальным, так тому и быть. Если нет, запомните, чт параметров всегда передаются с var. Возможно у Вас самозародились мысли о дальнейшем уплотнении программы. Вынести Assign выше, перед условным оператором. Отказаться от объявления проц после условного оператора. Туда же отправить и Close. Короче, сегодня я добрый, и промолчу, но Вам должно быть стыдно. Не надо так делать. Никогда.
едуры, а её текст однокр
Бинарные
ли это кажется Вам
о файлы в качестве
атно вписать
А вот здесь мы (я) оказываемся(оказываюсь) в затруднительном положении (не путать с затруднительной позицией). Бинарные файлы бывают типизированные и нетипизированны Типизированные – для слабых духом. Для нас – только нетипизированны
198
е.
е
файлы. Это не только потому, что я так решил, а потому что типизированные файлы в работе реального (а не сферического в вакууме) программиста никогда не применяются. Только в том случае, если версия языка не поддерживает нетипизированных файлов. А затруднительное положение в том, что разработчики Pascal ABC, исходя из своих каких-то высших педагоги языка только тестовые и типизированные файлы.
Ладно, будем разби бинарными? Потому, что если открыть этот файл в любом текстовом (да и в нетекстовом тоже) редакторе, мы увидим не обычный человеческий текст, а кракозябры. Или, как говорил один из моих заказчиков –
рдочки». Почему мордочки? А вы
«мо В бинарный файл пишутся не символы, которые представляют собой текст, а, к примеру, числа. И пишутся так, как они хранятся в памяти. А целое число 123 в памяти выглядит совсем не так, как эти три цифры… Да и кроме чисел туда, в файл, можно много чего записать. Для чего это надо? Для компактности – это само собой. Числа в представлении занимают гораздо меньше места. Но это вопрос не то чтобы десятый, но скорее второй. Компактность эта начинает играть свою роль при огромных размерах файлов, а современные программы тяготеют к желанию сожрать всю доступную им память что на диске, что в памяти. Главное – бинарные файлы универсальны. Бинарный файл, один раз записанный будет прочитан хоть в Африке, хоть где. Ну и опять-таки, Маленький минус – чтобы бинарный фал был прочитан, нам нужно знать его формат. Не поняли? Продолжаем. Что такое типизированный бинарный файл? Это файл, в котором все записанные данные одного типа. Например, весь файл содержи целые числа, или только плавающие, или только строки длиной строго сорок символов. Причем целые только типа integer, плавающие только типа real, ну а строки сказано сорок – значит сорок, и никаких сорок один. Проблема в том, что в реальной жизни часто хоч Например, записа сразу после этого возникает мысль записать непонятно сколько целых и заранее неизвестно сколько плавающих. И перед каждой порцией чисел указать их количество. Типизированный файл нам здесь не помощник.
ческих соображений оставили в доступной нам версии
раться. Почему файлы вообще называются
откройте и присмотритесь.
таком
в бинарный файл можно записать что угодно.
т только
ется странного.
ть в файл десять целых чисел и двадцать дробных. А
199
Тем не менее, коротенько покажем на примере, что это такое.
Объявляем, открываем, записываем, закрываем.
program FBin; uses
Crt; var
F : file of integer;
int : integer; begin
Assign( F, 'filo.bin');
ReWrite(F);
int:=77;
Write( F, int);
int:=99;
Write( F, int);
Close(F); end.
Открытие бинарного файла очень похоже на открытие текстового. Закрытие файла вообще ничуть не изменилось. А вот на записи остановимся подробнее. Первый параметр – имя файла. Эт Второй параметр – имя переменной, значение которой мы хотим записать в файл. Обратите внимание, что тип пе строго совпадает с тем типом, который указан в правой части объявления файла. Запись выполняется два раза (конкретно в нашем случае) и тип переменной один и тоже. Ещё раз, даже если Вам это на заключается смы А теперь чтение:
сл типизированного файла.
о понятно.
ременной, которую мы записываем в файл
доело – в этом и
200
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]