11.2. Стандартные процедуры и функции для текстовых файлов
Текстовый файл представляет собой совокупность символов, разделенных на строки, причем в конце каждой строки стоит признак конца строки.
Особенностью работы с текстовыми файлами является то, что параметры, значения которых вводятся и выводятся с помощью процедур Read или Write, могут быть не обязательно типа Char или string, а и других простых типов (целых, вещественных типов при вводе; целых, вещественных типов, типа Boolean - при выводе). Эти процедуры могут также работать и с ASCIIZ-строками.
Имеется две стандартные файловые переменные для текстового файла: Input и Output. Переменная Input по умолчанию связана с клавиатурой, a Output - с экраном дисплея. Эти устройства автоматически открываются при запуске программы, т. е. фактически выполняются процедуры:
Assign(Input,''); Reset(Input);
Assign(0utput,' ' ) ; Rewrite(Output);
Они также автоматически закрываются после работы программы.
Если при работе с файлами типа Text в процедуре или функции не указана файловая переменная, считается, что используется файловая переменная Input или Output.
Файл типа Text может быть открыт либо для чтения процедурой Reset, либо для записи процедурой Rewrite или Append.
Далее кратко описаны процедуры и функции, используемые для файлов типа Text. Так же как и ранее, в этих подпрограммах F - файловая переменная, связанная с конкретным физическим файлом процедурой Assign.
ПРОЦЕДУРЫ
Append (F) - открытие файла для добавления в конец информации. Открывается существующий файл, с которым связана файловая переменная F, и указатель текущей компоненты файла настраивается на конец файла.
Flush (F) - освобождение буфера выходного файла. Информация из буфера вывода записывается в файл, с которым связана файловая переменная F.
Read(F, <список ввода>) - чтение информации из файла. Из файла, с которым связана файловая переменная F, читаются значения для одной или нескольких переменных списка ввода (см. ниже).
ReadLn(F, <список ввода>) - чтение строки из файла. То же, что и процедура Read, но непрочитанная часть строки, включая признак конца строки, пропускается.
SetTextBuf(F, Buf[, Size]) - назначение буфера ввода-вывода. Для файла, с которым связана файловая переменная F, назначается буфер ввода-вывода в виде переменной Buf (любого типа). Необязательный параметр Size задает размер буфера в байтах. Если этот параметр не указан, в качестве буфера используется вся переменная Buf. Если эта процедура не используется, для организации ввода-вывода берется стандартный буфер ввода-вывода размером в 128 байтов.
Write (F, <список вывода>) - запись информации в файл. В файл, с которым связана файловая переменная F, записываются значения выражений списка вывода (см. ниже).
WriteLn(F, <список вывода>) - запись строки в файл. То же, что и процедура Write, но выводимая информация завершается признаком конца строки.
ФУНКЦИИ
Eoln(F) - конец строки файла. Принимает значение True, если текущей компонентой файла является признак конца строки или если функция Eof (F) принимает значение True. В остальных случаях функция принимает значение False.
SeekEof (F) - конец файла. Отличается от Eof (F) тем, что стоящие в конце файла символы пробела и табуляции пропускаются.
SeekEoln(F) - конец строки файла. Отличается от Eoln(F) тем, что стоящие в конце строки символы пробела и табуляции пропускаются.
Пример. Прочитать из текстового файла А все записанные в него целые числа, преобразовать их в вещественные и вывести в текстовый файл В по 4 числа в строку.
program EXAMPLE16; |
|
var Fl, F2: Text; |
|
X: Real; |
|
i: Integer; |
|
begin |
|
{$I-} |
{внутренняя проверка правильности операции с файлом} |
Assign(Fl, 'А'); |
{связь с файлом А, содержащим только целые числа} |
Reset(Fl); |
{открыть файл для чтения} |
{$I+} |
{отключить внутреннюю проверку} |
if IOResult <> 0 then |
|
Writeln('Heт файла А') |
|
else |
|
begin |
|
Assign(F2, 'В'); |
{связь с файлом В} |
Rewrite(F2); |
{открыть файл для записи} |
repeat |
|
for i := 1 to 4 do |
|
if not SeekEof(Fl) then |
|
begin |
|
Read(Fl, X); |
|
Write(F2, X: 18) |
{Форматный вывод - см. ниже} |
end; |
|
WriteLn(F2) |
{переход на новую строку} |
until SeekEof(Fl); |
|
Close(Fl); |
|
Close(F2) |
|
end |
|
end. |
|
Ввод-вывод информации при работе с текстовым файлом (особенно когда в качестве файла выступает клавиатура или экран дисплея) осуществляется настолько часто, что стоит об этом сказать подробнее.
Ввод информации из файла осуществляется с помощью процедур Read и ReadLn. Форма использования этих процедур следующая:
Read(F, <список ввода>);
ReadLn(F, <список ввода>);
В этих операторах F - файловая переменная, связанная с файлом, из которого вводится информация. Как указывалось выше, если эта файловая переменная отсутствует, считается, что используется стандартная файловая переменная Input, a ввод стандартно осуществляется с клавиатуры. Список ввода представляет собой перечисленные через запятую имена переменных, которым присваиваются введенные значения. Переменные могут быть целого, вещественного, символьного типа, типа string или типа PChar. Их количество может быть любым (в том числе и пустым). Так как в текстовом файле информация хранится в виде символов, то при вводе значений целого и вещественного типа автоматически происходит перекодирование информации в двоичный формат. Отдельные числа в текстовом файле должны отделяться пробелами, знаками табуляции или признаками конца строки. При вводе символа из файла читается один символ, в том числе и символ возврата каретки (код 13), если функция Eoln(F) дает значение True, или символ конца файла (код 26), если функция Eof(F) дает значение True. При вводе величины типа string или PChar из файла читается необходимое число символов, но в пределах одной строки (до символа конца строки - код 13). При этом, если чтение осуществляется процедурой Read, признак конца строки не читается и при последующем чтении строковой информации в соответствующие переменные ничего заноситься не будет до тех пор, пока не будет прочитан признак конца строки (например, процедурой Readln).
Пример.
var А, В: Integer;
С: Real;
D, E: Char;
. . .
ReadLn(A, В, С, D, Е);
В этом примере с клавиатуры дисплея вводятся два целых числа, одно вещественное число и два символа.
Вывод информации в текстовый файл (в том числе и на экран дисплея) осуществляется с помощью процедур Write и WriteLn.
Write(F, <список вывода>);
WriteLn(F, <список вывода>);
В этих операторах, как и в операторах ввода, F - файловая переменная. Список же вывода - это перечисленные через запятую выражения, значения которых выводятся в текстовый файл. Выражения могут быть целого, вещественного, логического и символьного типа, а также типа string или PChar. Число элементов списка вывода может быть любым (в том числе и нулевым; при этом процедура Write не выполняет никаких действий, а процедура WriteLn осуществляет переход на новую строку). При выводе чисел происходит их автоматическая перекодировка в символьную форму. В случае логической величины выводится ее значение словом TRUE или FALSE.
Так как элементы списка вывода в общем случае являются выражениями, то они, в частности, могут быть и строковыми константами. Это позволяет осуществлять комментированный вывод информации, например:
WriteLn('Площадь фигуры равна: ', SFig);
WriteLn('Строка ', Name, ' содержит ', Len, ' символов');
В Turbo Pascal при выводе информации в текстовый файл по умолчанию отводится количество позиций, равное размеру этой информации. Так, например, при выводе символа отводится одна позиция, при выводе строки - число позиций, равное длине строки, при выводе целого числа - число позиций, равное числу значащих цифр плюс одна позиция под знак, если число отрицательное. Это необходимо учитывать при выводе последовательных элементов информации (например, нескольких целых чисел) и предусматривать меры, чтобы отдельные элементы информации не сливались друг с другом: вывод разделяющих пробелов, разнесение информации по разным строкам и т. д. Исключение составляют вещественные числа - под них выделяется 17 позиций, и при выводе они выравниваются по правому краю выделенного поля.
Изменить стандартную форму вывода можно используя систему форматов языка Паскаль. Всего в языке существует два формата вывода, которые записываются через двоеточие после соответствующего элемента вывода, например:
Write(Expression: M: N);
В этом примере Expression - выражение, значение которого выводится в файл (в данном случае - на экран дисплея); М и N - форматы.
Форматы М и N представляют собой в общем случае выражения целого типа. Первый формат можно использовать при выводе значений любого типа, и он определяет размер поля, в которое выводится данное значение (см. выше программу EXAMPLE 16). Выводимая информация выравнивается по правому краю поля. Если для вывода конкретной информации выделенного поля недостаточно, оно автоматически увеличивается до нужного размера. Если при выводе вещественного числа этот формат задан меньше 8, то он автоматически увеличивается до 8. Второй формат используется только с вещественными числами и определяет число знаков после десятичной точки, которые необходимо отобразить в файле. Если этот формат используется, то вещественное число представляется в форме с фиксированной точкой, в противном случае - с плавающей точкой.
Пример. Вывести на экран дисплея таблицу умножения целых чисел от 1 до 9.
program EXAMPLE17;
var i, j: Byte;
begin
WriteLn;
WriteLn('ТАБЛИЦА УМНОЖЕНИЯ': 45);
WriteLn;
Write(' ':10);
for j := 1 to 9 do
Write(j: 6);
WriteLn;
WriteLn;
for i := 1 to 9 do
begin
Write(i:6, ' ': 4);
for j := 1 to 9 do
Write(i * j: 6);
WriteLn
end
end.
|