Пример 1. Составить программу, которая:
а) запишет в файл Message. txt текстовое сообщение;
б) прочитает из файла Message. txt текстовое сообщение и выведет его на экран.
Пояснение. Для решения этой и подобной задач лучше составлять две отдельные программы: первая программа формирует файл, вторая – его обрабатывает.
Программы:
Program A;
Uses Crt;
Var s: string; { переменная s для хранения текстового сообщения }
f: text; { f – файловая переменная }
Begin
Clrscr;
Assign (f, ’Message. txt’); { связывание файловой переменной f с файлом ’Message. txt’, который будет создан в текущей папке }
Rewrite(f); { открыли файл для записи }
Write (‘Введите текст сообщения ‘);
Readln (s); { ввели в переменную s текст сообщения }
Writeln (f, s);{ записали в файл содержимое переменной s }
Close (f); { закрыли файл }
Writeln (‘Файл создан’);{ вывели на экран поясняющее сообщение }
Readln
End.
Program B;
Uses Crt;
Var m: string; { переменная m для хранения текстового сообщения }
t: text; { t – файловая переменная }
Begin
Clrscr;
Assign (t, ’Message. txt’); { связывание файловой переменной f с файлом ’Message. txt’, который существует в текущей папке }
Reset (t); { открыли файл для чтения }
Readln (t, m); { считали из файла t в переменную s текст сообщения}
Writeln (‘Сообщение:', m); { вывели на экран текст сообщения }
Close (t); { закрыли файл }
Readln
End.
Пример 2. Составить программу, которая:
а) запишет в файл Students.txt список студентов группы (фамилия и год рождения);
б) обработает файл Students.txt следующим образом:
- выведет на экран список студентов группы;
- выведет список студентов заданного года рождения;
- допишет в файл информацию о новом студенте.
Программы:
Program A;
Uses Crt;
Var fam: string; { переменная fam для хранения фамилии студента }
year, n, k: integer; { переменная year для хранения года рождения}
f: text; { f – файловая переменная }
Begin
Clrscr;
Assign (f, ’Students. txt’); { связывание файловой переменной f с файлом ’Students. txt’, который будет создан в текущей папке }
Rewrite(f); { открыли файл для записи }
Write (‘Введите количество студентов в группе ‘);
Readln (n);
For k:=1 To n Do
Begin
Write(‘Введите фамилию ’,k,’-го студента ’);
Readln (fam); { Ввели в переменную fam фамилию }
Writeln (f, fam); { записали в файл фамилию студента и символ Eoln }
Write(‘Введите год его рождения ’);
Readln (year); { Ввели в переменную year год рождения }
Writeln (f, year) { записали в файл год рождения студента и символ Eoln }
End;
Close (f); { закрыли файл }
Writeln (‘Файл создан’); { вывели на экран поясняющее сообщение}
Readln
End.
Program B;
Uses Crt;
Var fam: string; { переменная fam для хранения фамилии студента }
year, n,: integer; { переменная year для хранения года рождения }
f: text; { f – файловая переменная }
Begin
Clrscr;
Assign (f, ’Students. txt’); { связываем файловую переменную f с файлом ’Students. txt’, который будет создан в текущей папке }
{ а) вывод на экран содержимого файла ’Students. txt’ }
Reset (f); { открываем файл для чтения }
Writeln (‘Список группы ‘);
While Not Eof (f) Do { пока не достигнут конец файла }
Begin
Readln (f, fam); { читаем из файла фамилию и символ Eoln }
Readln (f, year);{ читаем из файла год рождения и символ Eoln}
Writeln (fam:20, year: 5) { печатаем фамилию и год рождения }
End;
Close (f); { закрываем файл }
{ б) поиск в файле студентов заданного года рождения }
Write (‘Задайте нужный год рождения ’);
Readln (x); { вводим год для поиска }
Reset (f); { снова открываем файл для чтения}
While Not Eof (f) Do { пока не достигнут конец файла }
Begin
Readln (f, fam); { читаем из файла фамилию и символ Eoln }
Readln (f, year);{ читаем из файла год рождения и символ Eoln}
If year = x then { если год рождения очередного студента равен требуемому }
Writeln (fam) { выводим фамилию на экран }
End;
Close (f); { закрываем файл }
{ в) дополнение файла данными о новом студенте }
Write (‘Введите фамилию нового студента ’);
Readln (fam);
Write (‘Введите год его рождения ’);
Readln (year);
Append (f); { открываем файл для дополнения }
Writeln (f, fam); { дописываем в файл новую фамилию (и Eoln) }
Writeln (f, year); { дописываем в файл год рождения (и Eoln) }
Close (f); { закрываем файл }
Readln
End.
Примечание. В приведенном примере программы при дополнении файла данными о новом студенте не производится проверка условия, что информация о новом студенте уже есть в файле.
Типизированные файлы
Записи типизированного (структурированного) файла имеют одинаковый тип (а значит, имеют одинаковый размер – именно поэтому к ним и возможен прямой доступ). Структуру типизированного файла представлена на Рис. 7.
Запись 0 | |||
Запись 1 | |||
Запись 2 | |||
Запись 3 | |||
Eof | |||
Рис. 7.Структура типизированного файла | |||
Записи файла пронумерованы. Нумерация начинается с нуля. В конце файла записан специальный неотображаемый символ Eof («End of file» - конец файла).
Для работы с типизированными файлами в языке Паскаль используются следующие команды, описания и функции:
1. Описание файловой переменной:
Var f: File Of <тип записи файла>;
где f – имя файловой переменной.
Файловая переменная – это переменная-указатель, посредством которой идет взаимодействие программы (чтение/запись данных) с внешним файлом.
Записи файла могут иметь любой из рассмотренных выше типов (как стандартный, так и сконструированный в блоке Type).
Например:
Type Stud = Record
Name: String;
Group: Integer;
Rating: Real
End;
Var f1: File of Stud; { записями файла f1 являются записи (Record) из трех полей }
f2: File Of Integer; { записи файла f2 – целые числа }
2. Связывание файловой переменной с конкретным именем внешнего файла:
Assign (f, <имя файла>);
где f – имя файловой переменной, <имя файла> - строковая константа или переменная. Например, выполнение команды Assign (f, ’c:\tp70\data’) свяжет файловую переменную f с файлом «data», который расположен на диске C: в папке с именем «tp70». После записи такой команды в тексте программы нигде далее не будет указываться имя файла, с которым работает программа.
3. Открытие файла для записи данных:
Rewrite (f);
Файл создается заново. Если для записи открыт уже существующий файл, то все данные из него будут потеряны.
4. Открытие файла для чтения данных:
Reset (f);
Для чтения можно открыть только существующий файл. Указатель устанавливается на первую запись (т.е. на первый символ первой строки) файла.
5. Запись данных в файл:
Write (f, <имя переменной>);
Тип переменной должен совпадать с типом записей файла.
6. Чтение данных из файла:
Read (f, <имя переменной>);
7. Закрытие файла:
Close (f);
8. Функция FileSize(f) возвращает количество записей в файле.
9. Функция FilePos (f) возвращает номер текущей записи, т.е. той записи файла, на которую указывает указатель.
10. Команда Seek (f, n) устанавливает указатель на запись файла с номером n. Например, команда Seek (f, FileSize(f)) установит указатель после последней записи файла. Это позволяет, в частности, дописывать данные в конец типизированного файла.