Лекция №7. Файлы.

Под файлом понимается либо именованная область внешней памяти ПК, либо логическое устройство – потенциальный источник или приемник информации.

Любой файл имеет три характерные особенности:

1)  у него есть имя, что дает программе возможность работать одновременно с несколькими файлами

2)  он содержит компоненты одного типа. Типом компонентов может быть любой тип Турбо Паскаля, кроме файлов. Иными словами нельзя создать «файл файлов».

3)  Длина вновь создаваемого файла никак не оговаривается при его объявлении и ограничивается только емкостью устройств внешней памяти.

Файловый тип или переменную файлового типа можно задать одним из способов:

<имя>= file of <тип> - типизированные файлы (file of - файл, из);

<имя>=text - текстовые файлы;

Например:

Type product=record

Name: string;

Code: integer;

end;

Var f1: file of char;

F2:text;

F3: file of product;

Вид файла определяет способ хранения информации в файле. Однако в Турбо Паскале нет средств контроля вида ранее созданных файлов. При объявлении уже существующих файлов программист должен сам следить за соответствием вида объявления характеру файла.

Доступ к файлам.

Любые файлы или логические устройства становятся доступны программе только после выполнения особой процедуры открытия файла (логического устройства). Эта процедура заключается в связывании ранее объявленной файловой переменной с именем существующего или вновь создаваемого файла, а так же в указании направления обмена информацией: чтение из файла или запись в него.

НЕ нашли? Не то? Что вы ищете?

Файловая переменная связывается с именем файла в результате обращения к стандартной процедуре ASSIGN:

Assign (<файловая переменная>, <имя файла или логического устройства>);

<имя файла или логического устройства> – текстовое выражение

Имя файла состоит из восьми разрешенных символов – прописных или строчных латинских букв, цифр и символов! @ # $ % ^ & ( ) ‘ ~ - _. За именем может следовать расширение – последовательность до трех разрешенных символов, отделяемое от имени файла точкой. Перед именем может указываться путь к файлу: имя диска и/или имя текущего каталога и имена каталогов вышестоящих уровней. Максимальная длина имени вместе с путем –79 символов.

Например,

Var ft: text;

Fs: file of string;

Fi: file of integer;

Const name=’d:\student\2kurs\pismo. txt’;

Begin

assign (ft, ‘123.dat’); – диск и каталог по умолчанию, установленные до начала работы программы

assign (fs, name);

assign (fi, ‘c:\int\chisla. dat’);

end.

Примеры логические устройства.

Стандартные аппаратные средства ПК, такие как клавиатура, дисплей, принтер и коммуникационные каналы ввода-вывода, определяются в Турбо Паскале специальными именами, которые называются логическими устройствами. Все они в Турбо Паскале рассматриваются как потенциальные источники или приемники текстовой информации.

CON – логическое имя, которое определяет консоль – клавиатуру или экран дисплея. Турбо Паскаль устанавливает различия между этими физическими устройствами по направлению передачи данных: чтение данных возможно только с клавиатуры, а запись – только на экран. Таким образом, с помощью логического устройства CON нельзя, например, прочитать данные с экрана ПК, хотя такая аппаратная возможность существует.

Ввод с клавиатуры буферируется: символы по мере нажатья на клавиши помещаются в специальный строковый буфер, который передается программе только после нажатия клавиши Enter. Буферизация ввода обеспечивает возможность редактирования вводимой строки стандартными средствами ДОС. При вводе символов осуществляется их эхо-повтор на экране ПК. В Турбо Паскале можно прочитать любой символ клавиатуры, в том числе и символ CR, вырабатываемый клавишей Enter, сразу после нажатия на соответствующую клавишу без эхо-повтора.

PRN – логическое имя принтера. Если к ПК подключено несколько принтеров, доступ к ним осуществляется по логическим именам LPT1, LPT2 и LPT3. Имена PRN и LPT1 первоначально – синонимы. Средствами ДОС можно присвоить имя PRN любому другому логическому устройству, способному принимать информацию.

Стандартный библиотечный модуль PRINTER, входящий в библиотеку TURBO. TPL, объявляет имя файловой переменной LST и связывает его с логическим устройством LPT1. Это дает возможность использовать простое обращение к принтеру. Например, программа

Uses printer;

Begin

Writeln(Lst, ‘Привет мир!’);

End.

Выведет на принтер фразу «Привет мир!», а все необходимые операции по открытию логического устройства выполнит библиотечный блок PRINTER.

Связь логического устройства с файловой переменной осуществляется процедурой ASSIGN, например:

Var fo:text;

Begin

Assign(fo, ‘LPT2’);

End.

Турбо Паскаль никогда не связывает имена логических устройств с дисковыми файлами, поэтому эти имена можно считать зарезервированными. Иными словами, нельзя, например, обратиться к дисковому файлу с именем PRN, т. к. Турбо Паскаль всегда интерпретирует такой запрос как обращение к принтеру.

Инициализация файла.

Инициализировать файл означает указать для этого файла направление передачи данных. В Турбо Паскале можно открыть файл для чтения, для записи, а так же для чтения и записи одновременно.

RESET (<файловая переменная>);

Файловая переменная должна быть связана процедурой ASSIGN с уже существующим файлом или логическим устройством приемником информации.

При выполнении этой процедуры дисковый файл или логическое устройство подготавливается к чтению информации. В результате специальная переменная - указатель, связанная с этим файлом, будет указывать на начало файла, т. е. на компонент с порядковым номером 0.

REWRITE(<файловая переменная>);

инициирует запись информации в файл или логическое устройство, связанное ранее с файловой переменной. Процедурой REWRITE нельзя инициировать запись информации в ранее существующий дисковый файл: при выполнении этой процедуры стандартный файл уничтожается и никаких сообщений об этом в программу не передается. Новый файл подготавливается к приему информации и его указатель принимает значение 0.

Стандартная процедура

APPEND(<файловая переменная>);

инициирует запись в ранее существующий текстовый файл для его расширения, при этом указатель файла устанавливается в его конец. Процедура APPEND применима только к текстовым файлам, т. е. их файловая переменная должна быть типа TEXT. Если текстовый файл ранее был открыт с помощью Reset или Rewrite, использование Append приведет к закрытию этого файла и открытию его вновь, но уже для добавления записей.

После работы с файлом необходимо закрыть файл с помощью процедуры

CLOSE (<файловая переменная >); Эта процедура ставит специальную метку конца файла, что в большинстве случаев является просто необходимым.

Примеры процедур и функций для работы с файлами.

filesize(f) — возвращает текущее число компонент открытого файла;

filepos(f) — возвращает номер текущей позиции маркера;

seek(f, N) — устанавливает маркер на позицию N;

rename(f, имя) — переименование файла, связанного с f;

erase(f) — уничтожение файла;

execute(f) — выполнение COM-файла;

eof(f) — возвращает TRUE, если найден конец файла;

eoln(f) — возвращает TRUE, если найден конец строки.

Текстовые файлы.

Текстовые файлы предназначены для хранения текстовой информации. Они трактуются в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN (End Of LiNe – конец строки), а в конце всего файла – признак EOF (End Of File - конец файла). При формировании текстовых файлов используются следующие системные соглашения :

EOLN - последовательность кодов ASCII #13(Cr) и #10 (LF);

EOF – код #26 стандарта ASCII.

Для доступа к записям применяются процедуры READ, READLN, WRITE, WRITELN.

Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисляемых процедур может стоять файловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с переменной процедурой ASSIGN. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT и OUTPUT.

Процедура READ обеспечивает ввод символов, чисел и строк.

Формат обращения: READ (файловая переменная, список);

список – последовательность одной или более переменных типа char, string, а так же любого целого или вещественного типа.

При вводе переменных типа char выполняется чтение одного символа из файла и присваивание считанного значения переменной.

При вводе переменных типа string количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до конца строки отбрасываются, а новое обращение к READ возвращает пустую строку. Таким образом, процедура READ не в состоянии прочесть последовательность строк: первая строка будет прочтена нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру READLN .

Процедура READ прекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т. е. фактически весь файл рассматривается как одна длинная строка, содержащая текстовое представление чисел. При заполнении файла вручную, числа должны разделяться пробелами.

Процедура READLN обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре READ за исключением того, что после считывания последней переменной оставшаяся часть строки до маркера пропускается, поэтому следующее обращение к READLN или READ начинается с первого символа новой строки.

Процедура WRITE обеспечивает ввод информации в текстовый файл или передачу ее на логическое устройство. Формат обращения: WRITE (файловая переменная, список);

список – последовательность одной или более переменных типа char, string, boolean, а так же любого целого или вещественного типа. При выводе логических выражений в зависимости от их значения выводятся строки TRUE или FALSE.(Ввод логических констант процедурами READ или READLN не предусмотрен).

Процедура WRITELN полностью идентична процедуре WRITE, за исключением того, что выводимая строка символов завершается кодами CR и LF.

Пример, иллюстрирующий работу с текстовым файлом. Подсчитывается общее количество символов в файле и результат делится на 40000 – таким способом можно оценить объем рукописи в так называемых учетно-издательских листах:

program ex_1;

uses crt;

var f:text;

s:string;

const

sum:longint=0;

Begin

write(' Введите имя файла ');

Readln(s);

assign(f, s);

reset (f);

while not eof(f) do

begin

readln(f, s);

inc(sum, length(s));

end;

close(f);

writeln('Объем = ',sum/40000:6:2, ‘ уч. изд. л.’);

end.

Типизированные файлы.

Длина любого типизированного файла строго постоянна, что дает возможность организовать прямой доступ к каждому из них (т. е. доступ к компоненту по его порядковому номеру).

Перед первым обращением к процедурам ввода-вывода указатель файла стоит в его начале и указывает на первый компонент с номером 0. После каждого чтения или записи указатель сдвигается к следующему компоненту файла. Переменные в списках ввода-вывода должны иметь тот же тип, что и компоненты файла. Если этих переменных в списке несколько, указатель будет смещаться после каждой операции обмена данными между переменными и дисковым файлом.

Процедура READ обеспечивает чтение очередных компонентов типизированного файла. Формат обращения: READ (файловая переменная, список);

список – список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла. Файловая переменная должна быть объявлена предложением FILE OF… и связана с именем файла процедурой ASSIGN. Файл необходимо открыть процедурой RESET. Если файл исчерпан, обращение к READ вызовет ошибку ввода-вывода.

Процедура WRITE используется для записи данных в типизированный файл.

Формат обращения: WRITE (файловая переменная, список);

список – список ввода, содержащий одну или более переменных такого же типа, что и компоненты файла.

Для записи информации в новый файл, его необходимо открыть процедурой REWRITE. В Турбо Паскале разрешается обращаться к типизированным файлам, открытым процедурой RESET (т. е. для чтения информации), с помощью процедуры WRITE (т. е. для записи информации). Такая возможность позволяет легко обновлять ранее созданные типизированные файлы и при необходимости расширять их. Для текстовых файлов, открытых процедурой Reset, нельзя использовать процедуру Write или Writeln.

Стандартная процедура

Пример 1. Создать и сохранить в файле ‘x. dat’ последовательность целых чисел от 10 до 20;

program ex2;

uses crt;

var fi:file of integer ;

i:integer;

Begin clrscr;

assign(fi,'x. dat'); rewrite(fi);

for i:=10 to 20 do

write(fi, i);

close(fi);

end.

Пример 2. Считать первые пять компонент из файла ‘x. dat’ и вывести на экран квадраты этих значений.

program ex3;

uses crt;

var fi:file of integer ;

i:integer;

Begin clrscr;

assign(fi,'x. dat'); reset(fi);

while not eof(fi) do

begin

read(fi, i );

write (i*i,' ');

end;

close(fi);

readkey;

end.