Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чернов Шафеева.doc
Скачиваний:
47
Добавлен:
21.05.2015
Размер:
1.39 Mб
Скачать

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

Процедуры и функции

Выполняемые действия

Assign(Var f, Name:

String)

RESET(Var f)

REWRITE(Var f) CLOSE(f)

Erase(Var f)

ReName(f, NewName:

string)

EOF(f: boolean)

FLUSH(<ф.п.>)

ChDir(<каталог>) GetDir(<л.у.>,<каталог>)

MkDir(<каталог>) RmDir(<каталог>)

Cвязывает <ф.п.> f с файлом Name

Открывает файла с логическим именем f для чтения.

Открывает файл с логическим именем f для записи

Закрывает файл с логическим именем f

Удаляет (стирает) физический файл, связанный с f, с диска. Стираемый файл должен быть закрыт

Переименовывает физический файл, ранее связаный с файловой переменной f, в новое имя NewName

Функция возвращает значение TRUE, если достигнут признак конца файла или файл пуст, иначе возвращает FALSE.

Очищает внутренний буфер файла

Изменяет текущий каталог

Определяет имя текущего каталога, где <каталог> 

переменная типа string

Создает новый каталог на диске

Удаляет пустой каталог

Процедура CLOSE(f) закрывает открытый ранее логический файл f и обеспечивает сохранение всех записей и регистрацию файла на диске. Вы­зовы процедуры CLOSE необходимы для завершения работы с файлами. Также необходимо закрывать открытые файлы перед их удалением (ERASE) или пе­реименованием (RENAME). Попытка закрыть уже закрытый файл или еще не открытый вызовет сбой в работе программы. Закрытие файлов выполняется автоматически по отношению ко всем открытым файлам при нормальном за­вершении программы. При этом, связь файла с файловыми переменными сох­раняется.

При переименовании процедурой ReNAME менять можно лишь имя файла, имя диска менять нельзя. Предварительно файл должен быть закрыт проце­дурой CLOSE.

Функция EOF(f) тестирует конец файла. Если она возвращает TRUE, при записи очередной компонент будет добавлен в конец файла, при чте­нии  файл считается исчерпанным.

Существует также ряд других процедур и функций для определения объема свободного пространства (DiskFree), объема диска (DiskSize), условного признака последней операции ввода-вывода (Ioresult), атрибу­тов файла (GetfAttr), атрибутов первого из файлов, зарегистрированного в каталоге (FindFirst); поиска следующего файла в каталоге (FindNext);возвращения времени создания или последнего обновления файла (GetTi­me); установления новой даты создания или обновления файла (SetTime), атрибутов файла (SetfAtr); расщепления имени файла (FSPLIT); поиска файла в списке каталогов (FseArch); дополнения файлового имени до пол­ной спецификации (Fexpand) [1].

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

Это файлы последовательного доступа. Они предназначены для хране­ния текстовой информации.

Текстовые файлы связываются с файловыми переменными типа TEXT:

Var <ф.п.> : TEXT;

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

Для доступа к записям текстового файла применяются процедуры RE­AD, READLN, WRITE, WRITELN. В них можно использовать переменное число параметров, в качестве которых могут быть символы, строки и числа. Первым параметром в любой из перечисленных процедур может стоять фай­ловая переменная. В этом случае осуществляется обращение к дисковому файлу или логическому устройству, связанному с файловой переменной процедурой ASSIGN, и открытому процедурами RESET или REWRITE. Если файловая переменная не указана, происходит обращение к стандартным файлам INPUT и OUTPUT.

Процедура READ обеспечивает ввод символов, строки и чисел. Она имеет следующий формат

READ(<ф.п.>,<список_ввода>); или READ(<список_ввода>);

где <список_ввода>  последовательность из одной или более переменных типа CHAR, STRING или любого целого или вещественного типов, например:

READ(Х); ввод переменной Х с клавиатуры

READ(f,x1,x2,x3); ввод трех переменных из файла

При вводе переменной типа CHAR выполняется чтение одного символа из файла и присваивается считанное значение переменной. Если перед чтением указатель файла достиг конца очередной строки, то считывается символ CR (код 13). Если достигнут конец файла  то символ EOF.

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

Таким образом, READ не в состоянии прочесть последовательность строк: читается только одна строка, остальные окажутся пустыми. Для ввода последовательности строк символов применяется процедура READLN.

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

Процедура READLN также обеспечивает ввод символов, строк и чисел: READLN(f,x); или READLN(f, x1,x2,...,xN);

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

Эту процедуру можно вызвать без параметра <список ввода>: READLN(f); READLN; что приведет к пропуску всех символов текущей строки. Таким способом можно организовать ожидание нажатия клавиши ENTER при открытом окне результатов.

При чтении с клавиатуры курсор помещается в начало следующей строки, в то время как в процедуре READ остается в текущей строке.

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

WRITE(<ф.п.>,<список_вывода>]); или WRITE(<список_вывода>]);

где <список вывода> это последовательность из одного или более вы­ражений (переменных) символьного, строкового, логического, а также любого целого или вещественного типа, например:

WRITE(x); WRITE(f,x1,x2,xN);

Файловая переменная, если она указана, должна быть предварительно описана типом TEXT и связана с именем файла или логического устройства процедурой ASSIGN. Если файловая переменная отсутствует, подразумева­ется вывод в стандартный файл OUTPUT (на экран дисплея).

Любой элемент списка вывода X может быть представлен в следующей форме: X[:w[:d]], причем элементы, заключенные в квадратные скобки мо­гут отсутствовать. Здесь X  имя переменной или выражение, w, d  вы­ражения целого типа WORD (0..65535). Если параметр w присутствует, то он указывает минимальную ширину поля для записи значения X. При длине переменной X меньше w слева производится дополнение поля вывода пробе­лами, если Х больше w, то w игнорируется и выводится необходимое число символов (по умолчанию w=23); если параметр w не указан, то значение соответствующей переменной выводится вслед за предыдущим без како­го-либо разделения.

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

WRITE(X:6:2); {3.22}

WRITE(X:6:0); {3}

WRITE(X:4:2); {3.22}.

При выводе логических выражений в зависимости от значения выво­дятся подстроки TRUE и FALSE. Ввод логических констант процедурами RE­AD и READLN не предусмотрен.

Вывод процедурой WRITELN отличается от WRITE тем, что выводимая строка завершается кодами CR (возврат каретки) и LT (перевод строки), т. е. добавляет маркер конца строки.

При вызове WRITELN можно опускать <список_вывода>. В этом случае в файл передается признак конца строки EOLN, что при выводе на экран приводит к переводу курсора в начало следующей строки:

WRITELN(f); WRITELN;

Для текстовых файлов также применимы процедуры и функции (табл. 8).

Пример программы, которая вводит с клавиатуры три вещественных числа и в файл FXD.DAT записывает эти числа и их сумму.

PROGRAM FileFD;

VAR

y,x1,x2,x3:real;

FD:TEXT;

BEGIN

ASSIGN(FD,'FXD.DAT');

READ(x1,x2,x3); {ввод трех чисел}

REWRITE(FD); {открыть файл для записи}

y:=x1+x2+x3;

WRITELN(FD,'x1=',x1,' x2=',x2,' x3=',x3); {вывод в файл x1,x2,x3}

WRITELN(FD,'сумма=',y); {вывод в файл суммы}

CLOSE(FD); {закрыть файл}

END.

Таблица 8

Тексториентированные процедуры и функции

Процедуры, функции

Выполняемые действия

Append(<ф.п.>);

EOLN(<ф.п.>);

SeekEOLN(<ф.п.>);

SeekEOF(<ф.п.>);

Процедура открывает уже существующий файл f для дозаписи в его конец (для расширения)

Функция возвращает значение TRUE, если во входном файле f достигнуты маркеры конца строки EOLN или конца файла EOF, и FALSE  в противном случае

Функция пропускает все пробелы и знаки табу­ляции до первого признака EOLN или первого значащего символа. Возвращает значение TRUE, если обнаружен маркер конца файла или конца строки. Если <ф.п.> опущена, функция проверяет стандартный файл INPUT

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