Записи текстового файла – это строки различной длины, поэтому текстовые файлы являются файлами последовательного доступа. Структура текстового файла представлена на Рис. 6.
Eoln
Eoln
Eoln
Eoln
Eof
Рис. 6. Структура текстового файла
Таким образом, текстовый файл представляет собой совокупность строк разной длины. Именно поэтому к записям файла возможен только последовательный доступ. Каждая строка заканчивается специальным неотображаемым символом Eoln («End of line» - конец строки). В конце файла записан специальный неотображаемый символ Eof («End of file» - конец файла).
В текстовом файле может храниться не только текст, но и данные других типов (например, числа) в текстовом представлении (т.е. по сути дела все равно текст).
Для работы с текстовыми файлами в языке Паскаль используются следующие команды, описания и функции:
1. Описание файловой переменной:
Var f : text;
где f – имя файловой переменной, text – еще один стандартный тип данных – текстовый файл.
Файловая переменная – это переменная-указатель, посредством которой идет взаимодействие программы (чтение/запись данных) с внешним файлом.
2. Связывание файловой переменной с конкретным именем внешнего файла:
Assign ( f, <имя файла> );
где f – имя файловой переменной, <имя файла> - строковая константа или переменная. Например, выполнение команды
Assign ( f, ’c:\tp70\example.txt’ );
свяжет файловую переменную f с файлом «example.txt», который расположен на диске C: в папке с именем «tp70». После записи такой команды в тексте программы нигде далее не будет указываться имя файла, с которым работает программа.
3. Открытие файла для записи данных:
Rewrite (f);
Файл создается заново. Если для записи открыт уже существующий файл, то все данные из него будут потеряны.
4. Открытие файла для чтения данных:
Reset (f);
Для чтения можно открыть только существующий файл. Указатель устанавливается на первую запись (т.е. на первый символ первой строки) файла.
5. Открытие файла для дополнения (т.е. дописывания данных в конец файла):
Append (f);
Для дополнения можно открыть только существующий файл. Указатель устанавливается после последней записи (строки).
6. Запись данных в файл:
Write ( f, <список вывода> );
По сути, используется та же команда, что и для вывода данных на экран. Имя файловой переменной f указывает на то, что вывод будет осуществляться в файл.
Команда Writeln ( f, <список вывода> ); записывает в текстовый файл данные и символ Eoln.
7. Чтение данных из файла:
Read ( f, <список переменных> );
Команда Readln ( f, <список переменных> ); позволяет прочитать данные, а также символ Eoln.
8. Закрытие файла:
Close ( f );
9. Логическая функция Eof ( f ) возвращает значение ИСТИНА, если указатель указывает на символ конца файла и ЛОЖЬ в противном случае.
10. Логическая функция Eoln ( f ) возвращает значение ИСТИНА, если указатель указывает на символ конца строки и ЛОЖЬ в противном случае.
Примеры решаемых задач
Пример 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.
Примечание. В приведенном примере программы при дополнении файла данными о новом студенте не производится проверка условия, что информация о новом студенте уже есть в файле.