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

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

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. Тестируются эти признаки одноименными логическими функциями.

Для доступа к записям текстового файла применяются процедуры READ, 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. Ввод логических констант процедурами READ и READLN не предусмотрен.

PascalABC [урок 12] Работа с файлами, основные файловые процедуры и функции


Похожие статьи.

Понравилась статья? Поделиться с друзьями: