- •Глава 6
- •6.1. Понятие структурного типа
- •6.2. Регулярные типы (массивы)
- •6.3. Строковый тип
- •6.4. Комбинированные типы (записи)
- •6.4.1. Определение типа "запись"
- •6.4.2. Записи с вариантами
- •6.4.3. Оператор присоединения
- •6.5. Множественные типы
- •6.6. Файловые типы
- •6.7. Текстовые файлы
- •6.7.1. Определение текстового файла
- •6.7.2. Ввод числовых данных из текстовых файлов
- •6.7.3. Вывод числовых данных в текстовый файл
- •6.8. Ссылочные типы
- •6.8.1. Динамические переменные
- •6.8.2. Линейные списки
- •6.9. Типизированные константы
6.6. Файловые типы
Файл - это область памяти на внешнем запоминающем устройстве, предназначенная для хранения информации.
В языке Паскаль файл определяется как структура, представляющая собой последовательность компонент одного типа, расположенных на внеш-нем устройстве.
Данные могут как записываться в файл, так и читаться из него.
Файловый тип определяется следующим образом: TYPE typnam = FILE OF T , где typnam - имя файлового типа; T - базовый тип компонент файла. Базовый тип комопнент - любой, в том числе и структурный, кроме файло-вого.
Файл можно представить как последовательность комопонент (рис.6.4). Компоненты файла считаются пронумерованными, начальная компонента имеет нулевой номер.
С файлом связано понятие текущего указателя, который существует неявно и указывает на конкретную компоненту.
комп 0
комп
1
....... комп
k
.......
текущий
указатель
Рис.6.4.
Структура файла
Пример объявления файлов: TYPE Ftyp = FILE OF real ; fstr = FILE OF STRING[20] ; VAR f1,f2 : Ftyp; af : fstr; bf : FILE OF ARRAY[[1..25] OF student .
Для файлов определен набор операций, реализуемых с помощью специальных процедур и функций (F - файловая переменная):
Установочные и завершающие операции
Процедура Assign(F,Name) |
устанавливает связь между файлом на внешнем запоминающем устройстве и программой. Name - имя файла (типа STRING). |
Процедура Reset(F) |
открывает существующий файл для чтения. Текущий указатель устанавливается на нулевой элемент. |
Процедура Rewrite(F) |
открывает файл для записи. Если файл существует, то она очищает его. Текущий указатель устанавливается на нулевой элемент. |
Процедура Close(F) |
завершает работу с файлом и закрывает его. |
Операции чтения-записи
Процедура Read(F,D1,D2... Dn ) |
реализует чтение данных из файла в программу. D1,D2... Dn - переменные, тип которых должен совпадать с базовым типом файла F. |
Процедура Write(F,D1,D2... Dn ) |
выполняет запись данных в файл. D1,D2...Dn - переменные, тип которых должен совпадать с базовым типом файла F. После записи очередной компоненты текущий указатель перемещается в следующую позицию. |
Перемещение по файлу
Процедура Seek(F,p) |
устанавливает текущий указатель в позицию с номером p:longint . |
Процедура Truncate(F) |
отсекает от файла "хвостовую" часть, начиная с позиции текущего указателя. |
Функция FileSize(F):longint |
возвращает общее количество компонент файла. |
Функция FilePos(F):longint |
возвращает номер компоненты, на которую установлен текущий указатель. |
Функция EoF(F):Boolean |
возвращает TRUE, если достигнут конец файла (т.е. текущий указатель показывает на пустую позицию) и FALSE в противном случае. |
Пример 6.6.1. Продемонстрировать запись в файл и чтение из файла данных о группе студентов.
PROGRAM Stgr;
CONST n = 25;
TYPE student = RECORD
fam : STRING[20];
gr : integer
END;
studgrup = ARRAY[1..n] OF student;
VAR one : student;
grup : studgrup;
fs : FILE OF student;
fg : FILE OF studgrup;
k : integer;
BEGIN
{ Ввод данных о группе студентов }
FOR k:=1 TO n DO
BEGIN
WriteLn('Студент номер ', k);
Write('Фамилия : '); ReadLn(grup[k].fam);
Write('Год рождения : '); ReadLn(grup[k].gr);
END;
{Записать в файл 'Grup.std' данные о группе студентов}
Assign(fs, 'Grup.std');
Rewrite(fs);
FOR k:=1 TO n DO Write(fs, grup[k]);
Close (fs);
{ Возможен и такой вариант
Assign(fg, 'Grup1.std');
Rewrite(fg);
Write(fg, grup);
Close (fg);
}
{ Прочитать из файла 'Grup.std' и отпечатать фамилии }
{ всех студентов группы }
Assign(fs, 'Grup.std');
Reset(fs);
FOR k:=1 TO FileSize(fs) DO
BEGIN
Read(fs, one);
WriteLn(one.fam)
END;
{ Можно и так:
Assign(fs, 'Grup.std');
Reset(fs);
WHILE NOT EoF(fs) DO
BEGIN Read(fs,one);
WriteLn(one.fam)
END;
}
Close(fs)
END.
Задачи
6.6.1. Записать в файл массив из 1000 чисел.
6.6.2. Имеется файл, содержащий 1000 чисел. Переписать в другой файл только положительные числа.
6.6.3. Имеется файл с данными о группе студентов. Сформировать два файла с данными о лицах мужского и женского пола раздельно.
6.6.4. Файл с данными о группе студентов прочитать в обратном порядке (от конца к началу). Имя файла задается с клавиатуры.