Установка связи между файловой переменной и физическим внешним устройством
Процедура Assign (Var f ; FileName : String) устанавливает связь между логическим файлом, описываемым файловой переменной f любого файлового типа, и конкретным файлом MS–DOS, название которого содержится в строковом параметре FileName. Иными словами, логический файл f связывается с физическим файлом FileName. Строка FileName может содержать имя файла на диске (в том числе полное имя файла), имя стандартного устройства MS–DOS (‘CON’, ‘PRN’ и т. п.) или пустую строку ‘’ .
Assign (f, ‘file.dat’); {Связь с файлом текущего каталога}
Assign (f, ‘a : \ X .dat’); {Связь с файлом на диске а:}
Assign (f, ‘LPT1’); {Связь с принтером}
Assign (f, ‘’); {Связь со стандартным файлом, как правило, файлом ‘CON’}
Имя физического файла должно быть корректным и уникальным. Нельзя вставлять символы шаблонов ‘*’ и ‘?’ в имя файла, но можно связывать файловые переменные с еще не существующими файлами на диске (для дальнейшего их создания).
После того, как логический файл связан с физическим, его можно открыть для чтения или записи.
1.3. Понятие буфера ввода–вывода
С файловой системой Турбо Паскаля связано понятие буфера ввода–вывода. Ввод–вывод данных осуществляется через буфер. Буфер – это область в памяти, отводимая при открытии файла. При записи в файл вся информация сначала направляется в буфер и там накапливается до тех пор, пока весь объем буфера не будет заполнен. Только после этого или после специальной команды сброса буфера происходит передача данных по назначению: на диск, в порт. Аналогично при чтении из файла считывается не столько, сколько запрашивается, а сколько уместится в буфер.
Механизм буферизации позволяет более быстро и эффективно обмениваться информацией с различными устройствами. Для текстовых и бестиповых файлов можно устанавливать размер буфера по своему усмотрению.
Типизированные файлы
Типизированный, или компонентный, файл – это файл с объявленым типом его компонентов, т.е. файл с наборами данных одной и той же структуры. Объявление такого файлового типа имеет вид
Type f : File Of <Тип>.
Компонент может иметь любой ординарный или структурированный тип, предопределенный или построенный программистом. Запрещено лишь объявлять файлы файлов и файлы объектов, а также файлы структурированных компонентов (массивов, записей и др.), содержащих те же файлы или объекты.
Допустимы следующие объявления:
Type
Dim = Array [1..100, 1..2] of Real;
Zap = Record
x, y : Byte;
a : Dim;
End;
Df = File Of Dim;
Zf = File Of Zap;
Недопустимыми являются такие типы:
Type
ff1 = File Of File Of Real;
ff2 = File Of Df;
FZapF = Record
x, y : Byte;
f : File Of Char
End;
Zap = File Of FZapF;
При написании программ необязательно определять специальные файловые типы. Можно сразу описывать файловые переменные:
Var Fr : File Of Real; Fd : File Of Zap;
Длина любого компонента типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них.
Процедуры работы с типизированными файлами
Для того, чтобы считать данные из файла или записать данные в файл, необходимо выполнить процедуру инициализации файла. Инициировать файл означает указать для этого файла направление передачи информации. В Турбо Паскале можно открыть файл для чтения, для записи информации, а также для чтения и записи одновременно. Для инициализации типизированных файлов существуют следующие процедуры:
Reset (f);
где f – файловая переменная, связанная ранее процедурой Assign с уже существующим файлом или логическим устройством–приемником информации. При выполнении этой процедуры дисковый файл или логическое устройство подготавливается к чтению информации. В результате специальная переменная–указатель, связанная с этим файлом, будет указывать на начало файла, т.е. на компонент с порядковым номером 0;
Rewrite (f);
инициирует запись информации в файл или логическое устройство, связанное ранее с файловой переменной f. Процедурой Rewrite нельзя инициировать запись в ранее существовавший дисковый файл. При выполнении этой процедуры старый файл уничтожается и никаких сообщений об этом в программу не передается.
Процедура Close (f) закрывает файл. При создании нового или расширении старого файла процедура обеспечивает сохранение в файле всех новых записей и регистрацию файла в каталоге. Функции процедуры Close выполняются автоматически по отношению ко всем открытым файлам при нормальном завершении программы.
Для чтения данных из типизированного файла предназначена процедура
Read (f, <сп. ввода>);
где <сп. ввода> – список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла (того же типа, что и тип в предложении File Of < тип >). Перед первым обращением к процедурам ввода–вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными.
Для записи данных в типизированный файл используется процедура
Write (f, <сп. ввода>);
Параметры аналогичны параметрам процедуры Read. При записи в типизированные файлы записывается машинное представление очередного компонента, будь то число, массив, запись или строка. Внутри файла компоненты не отделяются ничем друг от друга. Поэтому не имеет смысла применять к типизированным файлам операторы Readln и Writeln. В них просто не существует такого понятия, как строка и ее конец.
Функция Eof (f) возвращает результат типа Boolean: True, если считан последний компонент файла, и False – в противном случае. Файл f должен быть открыт.
Файл – это последовательная структура данных. Естественным способом доступа к компонентам файла является последовательный доступ. После открытия файла он “ждет” чтения или записи первого компонента. После каждого очередного обращения к файлу он готов выдать или принять очередной по счету компонент. Пусть нужно прочитать из файла f пятый элемент и записать его в переменную V соответствующего типа. Это можно сделать, считав “впустую” четыре первых значения:
Reset (f); For i := 1 to 5 do Read (f, V); Writeln(V);
В V останется последнее, пятое, значение из файла. Это не самое удачное решение проблемы. Существуют встроенные процедуры и функции Турбо Паскаля для прямого доступа к компонентам файла.
ПроцедураSeek (f , <N компонента>) – устанавливает номер текущего компонента файла f. Назначенный компонент будет считан или записан последующей операцией ввода–вывода. Эта процедура непосредственно реализует прямой доступ в файл.
Функция FilePos (f)возвращает номер текущего компонента. Результат типа Longint.
Функция Filesize (f)возвращает реальное число записей в открытом файле. Результат типа Longint.
Truncate (f)– усекает файл f по текущему положению указателя.
Задача 1.Составить программу формирования файла целых чисел на дискете. Ввод исходных данных производится с клавиатуры.
Program Task1;
Uses CRT;
Var ct : File Of Integer;
{Объявили файловую переменную. Тип компоненты – Integer}
i, n, m: Integer;
Begin
Clrscr;
Assign (ct, ‘a:\int.dat’);
{Связали файловую переменную с файлом на диске А:}
Rewrite(ct); {Открываем новый файл}
Writeln(‘Сколько чисел будет записано в файл?’);
Readln(n); {Ввод количества элементов массива}
Write(ct, n); {Запись введенного числа на диск}
For i := 1 To n Do {Цикл по количеству элементов в файле}
Begin
Readln(m); {Ввод целого числа с клавиатуры в оперативную память}
Write(ct, m); {Запись на диск в файл}
End;
Repeat Until keypressed; {Цикл задержки экрана – повторять,
пока не будет нажата какая-либо клавиша}
Close (ct); {Закрыть файл}
End.
Задача 2.Вывести на экран дисплея содержимое файла, сформированного в предыдущей программе.
Program Task2;
Uses CRT;
Var ct : File Of Integer;
i, n, m: Integer;
Begin
Clrscr;
Assign (ct, ‘a:\int.dat’);
Reset(ct);
Read(ct, n);
{Считали первый элемент файла – количество компонентов файла}
Writeln(‘Количество компонентов в файле = ‘,n);
For i := 1 To n Do
Begin
Read(ct, m); {Считали информацию из файла}
Writeln(i, ‘-й компонент ‘, m); {Вывели информацию на экран}
End;
Repeat Until keypressed;
Close (ct);
End.