Установка связи между файловой переменной и физическим внешним устройством

Процедура 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.