21. Тип данных файл. Виды файлов. Работа с текстовыми файлами.

Файл представляет собой именованную последовательность однотипных элементов, размещенных на внешнем устройстве. Для выполнения операций с конкретным файлом в программе обычно используется так называемая файловая переменная или логический файл. В зависимости от типа элементов различают текстовые, типизированные и нетипизированные файлы.

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

var

F: text; {F - файловая переменная}

К типизированным файлам относятся файлы строго определенного типа. Чаще всего это файлы, состоящие из записей. Они применяются для создания различных баз данных.Типизированный файл - это файл, все компоненты которого одного типа, заданного при объявлении файловой переменной. Компоненты файла хранятся на диске во внутреннем (двоичном) формате и нумеруются с 0. Если посмотреть такой файл любым текстовым редактором, то можно распознать только символьную информацию, на месте же чисел в файле будут располагаться пробелы или символы псевдографики. Стандартное задание в программе такой файловой переменной осуществляется следующим образом:


type
FileRec = record
end;

var F : file of FileRec;

Нетипизированными называют файлы, объявленные без указания типа его компонентов. Операции чтения и записи с такими файлами осуществляются блоками. Отсутствие типа компонента делает эти файлы совместимыми с любыми другими, а выполнение ввода/вывода блоками позволяет организовать высокоскоростной обмен данными между диском и памятью. Нетипизированные файлы, как и типизированные, допускают организацию прямого доступа. Для определения в программе нетипизированного файла служит зарезервированное слово File:

var UntypedFile : File;

Работа с текстовыми файлами.

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


1. Функция EOLn( [Var f]): boolean - возвращает TRUE, если во входном текстовом файле достигнут маркер конца строки; при отсутствии файловой переменной проверяется стандартный файл INPUT, который обычно связан с клавиатурой.
2. Процедура Read( [Var f:text;] v1, v2,... vn) - обеспечивает ввод символов, строк и чисел. Список ввода представляет собой последовательность из одной или более переменных типа CHAR, STRFNG, а также любого целого и вещественного типа. При отсутствии файловой переменной ввод осуществляется из стандартного файла INPUT. При вводе значений переменных типа CHAR выполняется чтение одного символа из файла, считанное значение присваивается очередной переменной из списка ввода. Cимволы вводятся подряд, а не через пробел, как числа. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ #13, а если был достигнут конец файла, то - символ #26. При вводе переменных типа STRING количество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если раньше не встретились маркеры конца строки или конца файла, которые в строку не включаются. Символы, выходящие за размер максимальной длины строки, отбрасываются. Новое обращение к процедуре Read вернет пустую строку. Следовательно, процедура Read не в состоянии читать последовательность строк, так как первая строка будет прочитана правильно, а все последующие окажутся пустыми. При вводе числовых данных процедура Read пропускает все пробелы, знаки табуляции и маркеры до первого значащего символа и читает строку до пробела, знака табуляции или маркера. Полученная подстрока преобразуется из символьного во внутреннее представление в соответствии с типом значения и присваивается следующей переменной из списка. Если нарушен формат, то фиксируется ошибка ввода-вывода. Если достигнут маркер конца файла, то переменной присваивается значение 0, причем никаких сообщений в этом случае не выдается. Ввод логических констант процедурами Read и ReadLn не предусмотрен. Чтение с клавиатуры осуществляется через буфер, который передается процедуре при нажатии клавиши ENTER и имеет размер 127 байт, поэтому ввести с клавиатуры строку большего размера нельзя.
3. Процедура ReadLn( [Var f;] v1,v2, ,..,vn ) - также обеспечивает ввод символов, строк и чисел. Процедура использует те же правила ввода, что и процедура Read, но после чтения последней переменной оставшаяся часть строки до маркера конца строки пропускается, так что следующее обращение к ReadLn или Read начнется с первого символа новой строки. Процедура может быть вызвана без указания списка ввода, что приведет к пропуску всех символов текущей строки до маркера конца строки. Процедуры Read и ReadLn могут использоваться без указания файловой переменной. Тогда операция чтения осуществляется из стандартного файла INPUT. Использование процедуры ReadLn без параметров после процедуры Read приведет к очистке буфера ввода. Применение этой же процедуры без предшествующей ей процедуры Read переводит программу в состояние ввода, т.е. выполнение программы приостанавливается до нажатия клавиши ENTER, что может использоваться для организации паузы на время просмотра содержимого экрана.
4. Процедура Write( [Var f;] v1,v2, ...,vn ) - обеспечивает вывод данных в текстовый файл или передачу их на логическое устройство. Список вывода - последовательность из одного или более выражений типа CHAR, STRING, BOOLEAN, а также целого или вещественного типов. При выводе числовых значений последние преобразуются в символьное представление. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно назначен на экран.
5. Процедура WriteLn( [Var f;] v1,v2, ...,vn ) - обеспечивает вывод информации в текстовый файл или ее передачу на логическое устройство вывода. При отсутствии файловой переменной вывод осуществляется в стандартный файл OUTPUT, который обычно связан с дисплеем. Процедура полностью идентична процедуре Write, за исключением того, что выводимая строка символов завершается символами #13 и #10. При вызове WriteLn допускается опускать список вывода, в этом случае в файл передается маркер конца строки (при выводе на экран это приведет к переводу курсора в начало следующей строки).
6. Функция SeekEOLn( [Var f] ):boolean - пропускает все пробелы и знаки табуляции до маркера конца строки или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная не указана, то функция проверяет стандартный файл INPUT.
7. Функция SeekEOF( [Var f]):boolean - пропускает все пробелы, знаки табуляции и маркеры конца строки до маркера конца файла или до первого значащего символа и возвращает TRUE при обнаружении маркера. Если файловая переменная отсутствует, то функция проверяет стандартный файл INPUT

Hosted by uCoz