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




Следующие процедуры открывают логический файл с файловой перемен­ной <ф.п.>, связанной ранее с уже существующим файлом:

RESET(<ф.п.>) – для чтения,

REWRITE(<ф.п.>) – для записи.

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

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

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

В таблице 8 сведены общие процедуры и функции для работы с файлами, наиболее применимые на практике.

 

Таблица 8

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

Процедуры и функции Выполняемые действия
Assign (f, name) ReSet (f) ReWrite (f) Close (f) Erase (f)   ReName (f, NewName)   EOF (f) Связывает <ф.п.> f с именем файла name типа string Открывает файл с логическим именем f для чтения Открывает файл с логическим именем f для записи Закрывает файл с логическим именем f Удаляет (стирает) физический файл, связанный с f, с диска. Стираемый файл должен быть закрыт Переименовывает физический файл, связанный с <ф.п.> f, в файл с новым именем NewName Функция логического типа возвращает значение TRUE, если достигнут признак конца файла или файл пуст, иначе возвращает FALSE

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

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

 

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

Типизированные файлы позволяют организовать прямой доступ к каж­дой из компонент (по ее порядковому номеру), поскольку длина любого компонента типизированного файла строго постоянна. Описание файловой переменной для таких файлов выполняется в следующем виде:

Var < ф.п.>: file of <тип компонент>;

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

Для работы с типизированными файлами определены следующие проце­дуры и функции (табл. 9). Процедуру SEEK и функции FILESIZE, FILEPOS нельзя использовать для текстовых файлов.

Таблица 9

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

Процедуры, функции Выполняемые действия
READ(<ф.п.>, <список ввода>); WRITE(<ф.п.>, <список вывода>);   SEEK(<ф.п.>, <номер_компоненты>)   FILESIZE(<ф.п.>);   FILEPOS(<ф.п.>); Процедура обеспечивает чтение очередных ком­понентов файла Процедура используется для записи новых ком­понентов в файл; в качестве элементов вывода может стоять выражение. Процедура смещает указатель файла к компо­ненту с указанным номером; <номер_компоненты> – выражение типа Integer Функция возвращает количество компонент, содержащихся в файле Функция возвращает порядковый номер компо­ненты файла, доступной для чтения или записи

Чтобы переместить указатель в конец файла, можно написать, напри­мер: Seek(f, FileSize(f)); где f - файловая переменная.

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

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

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

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

Var <ф.п.>: TEXT;

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

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

 

Процедуры ввода

Процедура 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. Если файловая переменная отсутствует, подразумева­ется вывод в стандартный файл – на экран дисплея.

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

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

WRITELN(f); WRITELN;

Любой элемент X списка вывода для процедур WRITE/ WRITELN может быть представлен в следующем формате: 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}.

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

 

Таблица 10

Процедуры, функции Выполняемые действия
Append(f);   EOLN(f);     SeekEOLN(f);   SeekEOF(f); Процедура открывает уже существующий файл f для дозаписи в его конец (для расширения) Функция возвращает значение TRUE, если во входном файле f достигнуты маркеры конца строки EOLN или конца файла EOF, и FALSE - в противном случае Функция пропускает все пробелы и знаки табу­ляции до первого признака EOLN или первого значащего символа. Возвращает значение TRUE, если обнаружен маркер конца файла или конца строки Функция пропускает все пробелы, знаки табу­ляции и маркеры конца строк до маркера конца файла или первого значащего символа. Если мар­кер обнаружен, возвращает значение TRUE

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

 

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-06-11 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: