Файловый тип состоит из линейной последовательности компонентов, которые могут иметь любой тип за исключением файлового типа или структурного типа, содержащего компонент с файловым типом. Число компонентов описанием файлового типа не устанавливается. Каждый элемент файла имеет номер. Первый элемент файла считается нулевым элементом.
Стандартный файловый тип Text определяет файл, содержащий символы, упорядоченные в строки. Текстовые файлы используют специальные процедуры ввода-вывода (табл. 4.5).
Файловая переменная в Паскале – это любая переменная файлового типа. В Паскале имеются три класса файлов: типизированный файл, текстовый файл и нетипизированный файл.
Перед использованием файловой переменной она должна быть связана с внешним файлом с помощью вызова процедуры Assign, а также описана в блоке описания переменных. Внешним файлом обычно является поименованный файл на диске, но он также может представлять собой устройство, например, клавиатуру или дисплей. Во внешних файлах сохраняется записанная в файл информация, или они служат источниками информации, которая считывается из файла.
Когда связь с внешним файлом установлена, для подготовки ее к операции ввода или вывода файловая переменная должна быть "открыта". Существующий файл можно открыть с помощью процедуры Reset, новый файл можно создать и открыть с помощью процедуры Rewrite. Текстовые файлы, открытые с помощью процедуры Reset, доступны только по чтению, а текстовые файлы, открытые с помощью процедуры Rewrite, доступны только по записи. Типизированные и нетипизированные файлы всегда допускают как чтение, так и запись, независимо от того, были они открыты с помощью процедуры Reset или с помощью процедуры Rewrite.
Таблица 4.5
Процедуры и функции ввода-вывода
Append
Открывает существующий файл для добавления
Assign
Присваивает имя внешнего файла файловой переменной
BlockRead
Считывает из нетипизированного файла одну или более записей
BlockWrite
Записывает в нетипизированный файл одну или более записей
ChDir
Выполняет смену текущего каталога
Close
Закрывает открытый файл
Erase
Стирает внешний файл
Eоf
Возвращает для файла состояние end-of-file (конец файла)
FilePos
Возвращает текущую позицию в файле. Для текстовых файлов не используется
FileSize
Возвращает текущий размер файла. Для текстовых файлов не используется
Flush
Сбрасывает буфер текстового файла вывода.
Getdir
Возвращает текущий каталог на заданном диске
IОResult
Возвращает целое значение, являющееся состоянием последней выполненной операции ввода-вывода
MkDir
Создает подкаталог
Read
Считывает одно или более значений из файла в одну или более переменных
Readln
Делает то же, что и Read, и выполняет пропуск до начала следующей строки текстового файла
Rеnаме
Переименовывает внешний файл
Rеset
Открывает существующий файл
Rewritе
Создает и открывает новый файл
RмDir
Удаляет пустой подкаталог
Seek
Перемещает текущую позицию в файле на заданный элемент. Для текстовых файлов не используется
SeekEof
Возвращает для текстового файла состояние "конец файла"
SeekEoln
Возвращает для текстового файла состояние "конец строки"
SetTextBuf
Назначает для текстового файла буфер ввода- вывода.
Truncate
Усекает размер файла до текущей позиции. Для текстовых файлов не используется
Write
Записывает в файл одно или более значений
Writeln
Делает то же, что Write, но затем записывает в текстовый файл символ конца строки
Обычно доступ к файлам организуется последовательно, то есть, когда элемент считывается с помощью стандартной процедуры Read или записывается с помощью стандартной процедуры Write, текущая позиция файла перемещается к следующему по порядку элементу файла. Однако к типизированным и нетипизированным файлам можно организовать прямой доступ с помощью стандартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу. Для определения текущей позиции в файле и текущего размера файла можно использовать стандартные функции FilePоs и Filesize.
Когда программа завершает обработку файла, он должен закрываться с помощью стандартной процедуры Close. После полного закрытия файла связанный с ним внешний файл обновляется. Затем файловая переменная может быть связана с другим внешним файлом.
По умолчанию при всех обращениях к стандартным функциям и процедурам ввода-вывода автоматически производится проверка на наличие ошибок. При обнаружении ошибки программа прекращает работу и выводит на экран сообщение об ошибке.
Рассмотрим операции ввода и вывода, использующие файловую переменную стандартного текстового типа. Текстовый тип (тип Text) отличается от символьного типа Char.
При открытии текстового файла внешний файл интерпретируется особым образом: считается, что он представляет собой последовательность символов, сгруппированных в строки, где каждая строка заканчивается символом конца строки (end-of-line), который представляет собой символ перевода каретки, за которым возможно следует символ перевода строки.
Для текстовых файлов существует специальный вид операций чтения и записи (read и write), который позволяет считывать и записывать значения, тип которых отличается от символьного типа Char. Такие значения автоматически переводятся в символьное представление и обратно. Например, Read(f,i), где i – переменная целого типа, приведет к считыванию последовательности цифр, интерпретации этой последовательности, как десятичного числа, и сохранению его в i.
Как было отмечено ранее, имеются две стандартных переменных текстового типа – это Input и Оutput. Стандартная файловая переменная Input – это доступный только по чтению файл, связанный со стандартным файлом ввода операционной системы (обычно это клавиатура), а стандартная файловая переменная Оutput – это доступный только по записи файл, связанный со стандартным файлом вывода операционной системы (обычно это дисплей). Перед началом выполнения программы DOS файлы Input и Оutput автоматически открываются, как если бы были выполнены следующие операторы:
Assign(Input,'');
Reset(Input);
Assign(Output,'');
Rewrite(Output);
Так как Windows не поддерживает непосредственно ориентированный на текст ввод и вывод, файлы Input и Output по умолчанию в прикладной программе Windows не присваиваются, и любая попытка чтения из этих файлов или записи в них приведет к ошибке ввода-вывода. Однако если прикладная программа использует модуль WinCrt, то Input и Output будут ссылаться на прокручиваемое текстовое окно. Модуль WinCrt содержит логику управления, необходимую для эмуляции текстового экрана в операционной среде Windows, поэтому в прикладной программе, использующей модуль WinCrt, не требуется никаких приемов программирования, специфических для Windows.
Нетипизированные файлы представляют собой каналы ввода-вывода нижнего уровня, используемые в основном для прямого доступа к любому файлу на диске, независимо от его типа и структуры. Любой нетипизированный файл описывается словом file без атрибутов. Например:
var DataFile: file;
Для нетипизированных файлов в процедурах Reset и Rewrite допускается указывать дополнительный параметр, чтобы задать размер записи, использующийся при передаче файла.
По историческим причинам принимаемая по умолчанию длина записи равна 128 байтам. Предпочтительной длиной записи является длина записи, равная 1, поскольку это единственное значение, которое позволяет точно отразить размер любого файла (когда длина записи равна 1, то в файле не могут присутствовать неполные записи, то есть записи с меньшей длиной).
За исключением процедур Read и Write для всех нетипизированных файлов допускается использование любой стандартной процедуры, которую допускается использовать с типизированными файлами. Вместо процедур Read и Write здесь используются соответственно процедуры Blockrеаd и BlockWrite, позволяющие пересылать данные с высокой скоростью.