Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тurbo Pascal 7+.doc
Скачиваний:
12
Добавлен:
24.12.2018
Размер:
10.09 Mб
Скачать

Глава 15. Другие возможности Паскаля

Рассмотрим несколько дополнительных возможностей Паскаля..

15.1. Работа с файлами данных

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

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

Задача. Записать слово Азия и число 1998 на магнитный диск C: в текстовый файл с именем fedos.pas, располагающийся в каталоге PASCAL.

Начнем с того, что придумаем файлу fedos.pas псевдоним, которым мы будем пользоваться в программе. Пусть это будет fepas. Затем нам нужно объяснить Паскалю, что fepas - это текстовый файл, для чего мы начнем программу со строчки

VAR fepas Text,

Раздел операторов начинаем с того, что объясняем Паскалю, какое настоящее имя соответствует псевдониму fepas:

Assign(fepas, 'c:\PASCAL\fedos.pas');

Затем переместим магнитную головку в начало файла для записи информации в файл (откроем файл для записи):

Rewrite(fepas);

Теперь запишем в файл нужную информацию:

WriteLn(fepas,'Азия');

WriteLn(fepas, 1998);

Поскольку мы не собираемся ничего больше писать в файл, то закрываем его для записи:

Close(fepas);

Вот программа целиком:

VAR fepas :Text;

BEGIN

Assign(fepas, 'c:\PASCAL\fedos');

Rewrite(fepas);

WriteLn(fepas,'Азия');

WriteLn(fepas,1998);

Close(fepas);

END.

После выполнения программы вы обнаружите в файле fedos две строки:

Азия

1998

Если бы вы вместо WriteLn использовали Write, то строка была бы одна:

Азия1998

Если к моменту выполнения программы файл fedos не существовал, то процедура Rewrite создаст пустой файл с таким именем в указанном каталоге. Если существовал, то стирает его содержимое.

Если вы не хотите стирать содержимое файла, а просто хотите дописать что-нибудь в ею конец, то процедура Rewrite вам не подойдет. Вам вместо нее нужно будет употребить процедуру Append. Вот ее вызов - Append(fepas).

Если вы знаете, какой каталог во время выполнения программы является текущим, и хотите, чтобы файл fed был создан в текущем каталоге, вы можете записать просто

Assign(fepas, 'fedos')

Информация в наш файл может записываться только по порядку, последовательно. Мы не можем записать что-то сперва в начало файла, потом в конец, потом в середину. То же самое относится и к считыванию, о котором сейчас пойдет речь.

А теперь решим обратную задачу: в некотором файле fed записаны строки. Вывести первую и третью из них на экран монитора.

VAR fepas :Text;

a,b,c :String; {Три переменные в оперативной памяти, в которые будут записаны первые три строки из файла}

BEGIN

Assign(fepas, 'c:\PASCAL\fed');

Reset(fepas); {Переместим магнитную головку в начало файла для считывания информации из файла (откроем файл для считывания)}

ReadLn (fepas, a); {Читаем первую строку из файла}

ReadLn (fepas, b); {Читаем вторую строку из файла}

ReadLn (fepas, c); {Читаем третью строку из файла}

Close(fepas);

WriteLn(a); {Печатаем первую строку из файла}

WriteLn(c); {Печатаем третью строку из файла}

END.

Как видите, для того, чтобы добраться до третьей строки, нам пришлось прочитать вторую.

Если третья строка числовая, то можно было бы описать переменную с как числовую, а не строковую.

А теперь напишем программу, которая в цикле записывает в файл 10 строк, а затем для проверки их считывает,

VAR f :Text;

a,b :String;

i :Byte;

BEGIN

Assign(f,'c:\PASCAL\textik.txt'); {Обозначим файл textik.txt из каталога PASCAL именем f}

Rewrite(f); {Переместим магнитную головку в начало файла для записи информации в файл (откроем файл для записи)}

WriteLn('Введите с клавиатуры 10 произвольных строк');

for i:=1 to 10 do begin

ReadLn(a); {Ввести с клавиатуры в оперативную память произвольную строку текста}

WriteLn(f,a) {Записать эту строку из оперативной памяти в файл}

end;

Close(f); {Закрываем файл для записи}

WriteLn('A теперь посмотрим, что мы записали в файл:');

Reset(f); {Переместим магнитную головку в начало файла для считывания информации из файла(откроем файл для считывания)}

for i:=1 to 10 do begin

ReadLn(f ,b); {Переслать из файла в оперативную память строку текста}

WriteLn(b) {Послать эту строку из оперативной памяти на монитор}

end;

Close(f); {Закрываем файл для чтения}

END.

Если вы хотите прочесть текстовый файл, но не знаете, сколько там строк, то вам нужно какое-то средство, чтобы компьютер определил, когда заканчивается файл. Это средство - функция EOF (сокращение от end of file - "конец файла"). Вот фрагмент, решающий дело:

while NOT EOF(fepas) do ... ReadLn(fepas,....)

пока нет конца файла fepas делай чтение файла

Задание 126

"База данных ваших школьных оценок". Вы завели файл, в который записываете свои школьные оценки. Каждый раз, получив оценку, вы дописываете в файл оценку и предмет, по которому оценка получена. Создайте 4 программы:

  1. Для дозаписи в конец файла очередной оценки и предмета.

  2. Для вывода на экран всего файла.

  3. Для вывода на экран всех отметок по заданному предмету. (Для определенности договоримся, что больше 1000 оценок в год вы не получите.)

  4. Для определения, сколько было по заданному предмету таких-то оценок (скажем, троек).

Оформите каждую из четырех программ как процедуру и создайте единую программу - "Систему управления базой данных", которая начинает работу с вопроса: Чем будем заниматься - дозаписывать, выводить весь файл?... - и в зависимости от ответа запускает одну из четырех процедур.

Задание 127

Вы можете помочь адмиралу из раздела 12.13 и организовать чтение из файла всей нужной информации о подлодках.

Задание 128

Многие компьютерные игры можно сохранить, то есть в любой момент игры при нажатии определенной клавиши записывать в файл все данные о ситуации, чтобы в следующий раз, когда вы сядете играть, начинать не сначала, а с той ситуации, в который вы записались. В игре "Торпедная атака" организуйте при нажатии на клавишу S сохранение, то есть запись в файл, имени игрока, уровня игры, количества выстрелов и количества попаданий. А при запуске игра должна спрашивать, будем ли возобновлять сохраненную игру или начинать новую.