Лабораторная работа № 9. Программирование с использованием файлов
Цель работы:изучение приемов и средств, обеспечивающих хранение данных на дисках и их обработку
Объем работы: 2 часа
Теоретическая часть
Различают файлы трех типов: текстовые, типизированные и нетипизированные.
Текстовый файл – это файл, компонентами которого являются символьные строки переменной длины, заканчивающиеся специальным маркером конца строки (рис. 1).
Рис. 1. Структура текстового файла
Типизированный файл – это файл, все компоненты которого одного типа, заданного при объявлении файловой переменной (рис. 2). Компоненты файла хранятся на диске во внутреннем (двоичном) формате и нумеруются с 0. Если посмотреть такой файл любым текстовым редактором, то можно распознать только символьную информацию, на месте же чисел в файле будут располагаться пробелы или символы псевдографики.
Рис. 2. Типизированный файл
Текстовые файлы используют для хранения и обработки текстовой информации: символов, строк, символьных массивов. Логические и числовые данные при записи в текстовые файлы должны преобразовываться в символьные строки. При выполнении операций ввода-вывода с текстовыми файлами используют процедуры:
Процедура Read[Ln]([Var f:text;]v1,v2,...vn) – обеспечивает ввод из файла символов, строк и чисел. Список ввода представляет собой последовательность из одной или более переменных типа CHAR, STRING, а также любого целого и вещественного типа. при отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT. Процедура ReadLn – также обеспечивает ввод символов, строк и чисел, но после чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки. Процедура может быть вызвана без указания списка ввода, что приведет к пропуску всех символов текущей строки до маркера конца строки.
Процедура Write[Ln]([Var f;]v1,v2,...,vn) – обеспечивает вывод данных в текстовый файл или передачу их на логическое устройство. Список вывода – последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также целого или вещественного типов. При выводе числовых значений последние преобразуются в символьное представление. Процедура WriteLnпри вызове обеспечивает запись маркера «конец строки».
Пример 1. Разработать программу, которая формирует текстовый файл из 26 строк, содержащих случайное количество соответствующих прописных букв латинского алфавита, например:
ААААА
BBBBB
C
DDDDDDDDDDDDDDDDDDDDD
EEEEEEEEEEEEEE и т.д.
Program form_text_file;
{$APPTYPE CONSOLE}
Uses SysUtils;
Var f:text;{файловая переменная для текстового файла}
a:char; n,i:integer; fname,st:string[30];
Begin
WriteLn('Введите имя файла');
ReadLn(fname);
AssignFile(f,fname);{инициализируем файловую
переменную}
ReWrite(f); {открываем файл для записи}
Randomize; {инициализируем датчик случайных чисел}
for a:='A' to 'Z' do {формируем строки}
Begin
st:='';
n:=random(30)+1;
for i:=1 to n do st:=st+a;
WriteLn(f,st); {записываем строку в текстовый
файл}
WriteLn(st);{а также – выводим ее на экран}
end;
CloseFile(f);{закрываем файл}
End.
Для работы с типизированными файлами используют специальные процедуры и функции:
1. Процедура Read(Var f;c1,c2,...,cn) – осуществляет чтение очередных компонентов типизированного файла. Список переменных ввода содержит одну или несколько переменных того же типа, что и компоненты файла, разделенных запятыми. Если файл исчерпан, обращение к процедуре вызывает ошибку ввода-вывода.
2. Процедура Write(Var f;c1,c2,...,cn) – осуществляет запись данных в типизированный файл. Список вывода содержит одно или более выражений того же типа, что и компоненты файла, разделенных запятыми.
Пример 2. Разработать программу, которая создает типизированный файл, содержащий список фамилий и даты рождения. Осуществить поиск в этом файле даты рождения по заданной фамилии.
Program ex;
{$APPTYPE CONSOLE}
Uses SysUtils;
Type fam=record {тип запись «сведения о сотрудниках»}
ff:string[20]; {фамилия}
year:word; {год рождения}
month:1..12;{месяц рождения}
day:1..31 {день рождения}
end;
Var f:file of fam; {файловая переменная «файл
сотрудников»}
fb:fam;
n,i:integer;
fff:string;
key:boolean;
Begin
AssignFile(f,'a.dat'); {связываем файловую
переменную с файлом}
ReWrite(f);{открываем файл для записи}
WriteLn('Enter data or CTRL-Z');
while not EOF do {цикл, пока не введено CTRL-Z}
Begin
ReadLn(fb.ff,fb.year,fb.month, fb.day);
{вводим данные по полям, фамилию вводим в
отдельной строке, так как ввод строки завершается
нажатием клавиши Enter}
Write(f,fb); {заносим запись в файл как один
компонент}
end;
CloseFile(f); {закрываем файл}
WriteLn('Enter family');
Readln(fff);
key:=false; {устанавливаем признак «запись не
найдена»}
ReSet(f); {открываем файл для чтения}
while (not EOF(f)) and (not key) do {пока не
обнаружен конец файла и не найдена запись}
Begin
Read(f,fb); {читаем запись из файла}
if fb.ff=fff then {если фамилии совпадают, то}
begin {выводим данные}