Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5.DOC
Скачиваний:
5
Добавлен:
12.05.2015
Размер:
478.21 Кб
Скачать

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

Файлы, базовый тип которых определен как char, называюттекстовыми. Текстовые файлы являются стандартным типом с именемText , соответствующим описанию типа:

Text=file of Char.

Выделение этого типа в качестве стандартного обусловлено тем, что тексты обычно разбиваются на строки. Способ определения перехода с одной строки на другую основывается на применении специального управляющего символа (например, в ASCII для этих целей могут использоваться два символа: cr– возврат каретки иlf– перевод строки). В общем случае применение именно этих символов для обозначения конца строки не стандартизовано, поэтому для маркировки конца строки по аналогии с предикатомeofв языке Паскаль используется предикатEoln, а для работы с текстовыми файлами используются дополнительные процедурыWriteLn(f)иReadLn(f), смысл которых сводится к следующему:

  • WriteLn(f)заканчивает текущую строку текстового файла, т.е. обычно присваивает текущей компоненте файла значение, соответствующее маркеру конца строки;

  • ReadLn(f)пропускает все символы, предшествующие началу следующей строки текстового файлаf(f становиться равным первому символу следующей строки); процедура имеет смысл только приeof(f)=false;

  • eoln(f) булевская функция, которая возвращает значение true, если текущая позицияfсоответствует концу строки (при этом значениеf – символ пробела).

Три следующих фрагмента программ иллюстрируют формирование, чтение и копирование текстовых файлов.

  1. Формирование текстового файла F (при этом предполагается, что очередной символ текстаSопределяется с помощью некоторых действий, условно обозначенныхР(S), строка должна состоять изMсимволов, а весь текст содержитNстрок).

ReWrite(F);

for I:=1 to N do

begin

for J:=1 to M do

begin

P(S);

Write (F,S)

end;

WriteLn (F)

end;

2.Чтение текстового файлаF. ПустьR(S)обозначает действия, связанные с обработкой очередного символаS, аR(Str)– действия, выполняемые после чтения строки.

Reset(F);

while not Eof(F) do

begin

while not Eoln(F) do

begin

Read(F,S);

R(S)

end;

R(Str);

ReadLn(f)

end;

3.Копирование файлаFв файл F1с сохранением построчной структуры.

Reset(F);

ReWrite(F);

while not Eof(F) do

begin

while not Eoln(F) do

begin

Read(F,S);

Write (F,S)

end;

ReadLn(F);

Write (F)

end;

Стандартные файлы Input и Output

В разделе 2 на семантическом уровне уже рассматривались средства языка для ввода исходной и вывода результирующей информации. В примерах, приведенных в этом разделе, процедуры Readи Write использовались без параметра, определяющего файловую переменную. Последнее возможно благодаря тому, что в языке Паскаль предусмотрены стандартные текстовые файлы Input иOutput. При этом предполагается, что файлыInput иOutputсвязаны с определенным типом внешних устройств для каждой конкретной системы программирования (например, для систем программированияBorland Pascalсоответственно клавиатурой и видеотерминалом). Они не требуют описания в разделе типов ипо умолчаниюиспользуются транслятором как недостающий параметр, если имя файла в процедурахReadи Writeне указано.

Таким образом, эквивалентными можно считать следующие пары операторов:

Read (S); Read (Input, S);

Read (S); Read (Input, S);

Write (S) Write (Output, S);

Write (S) Write (Output, S)

Eof Eof(Input)

Eoln Eoln(Input)

Файлы Input иOutput не требуют применения стандартные процедурыReset иReWrite.

Кроме того, здесь следует отметить ранее не упоминавшееся несоответствие процедур Read иWrite принятой в языке концепции типов. Несоответствие проявляется в том, что в качестве фактических параметров этих процедур допустимо использование переменных не только символьного типа, который является базовым для текстовых файлов. Это свойство (свойство полиморфизма – буквально “множества форм”) процедур ввода-вывода требует уточнения в определении самих процедур.

Процедура Read. Пустьv1,v2, ... ,vn–переменные символьного, целого, их отрезков или вещественного типа, аf– текстовый файл. Тогда:

  • Read (v1,v2, ... ,vn)эквивалентноRead (Input, v1,v2, ... ,vn);

  • Read (f, v1,v2, ... ,vn)эквивалентно

beginRead (f, v1,); ... ;Read (f, vn,)end;

  • ReadLn(v1,v2, ... ,vn)эквивалентноReadLn (Input, v1,v2, ... ;vn);

  • ReadLn(f, v1,v2, ... ,vn)эквивалентно

beginRead (f, v1, ... ,vn,); ReadLn(f)end;

  • если параметр v символьного типа то Read (f,v)эквивалентно

beginv:=f; Get(f)end;

  • если параметр v целого (ограничения целого) или вещественного типа, то читается последовательность символов, представляющая в соответствии с синтаксисом языка целое или вещественное число, после чего происходит преобразование последовательности в форму, соответствующую представлению значения этого параметра в машине; при этом следующие друг за другом числа могут разделяться пробелом или признаком конца строки (в Borland Pascalэто клавиша <Enter>).

Процедура Write. Процедура позволяет дополнить текстовый файл строками, состоящими из одного или нескольких символов. Пустьf–текстовый файл, ар1,р2, ... ,рn–параметры, вид которых уточняется последним пунктом. Тогда:

  • Write (p1,p2, ... ,pn)эквивалентноWrite(Output, p1,p2, ... ,pn);

  • Write (f, p1,p2, ... ,pn)эквивалентно

beginWrite (f, p1,); ... ;Write (f, pn,)end;

  • WriteLn(p1,p2, ... ,pn)эквивалентноwriteln (output, p1,p2, ... ;pn);

  • WriteLn (f, p1,p2, ... ,pn)эквивалентно

begin Write (f, p1, ... ,pn,);WriteLn(f)end;

  • если параметр pсимвольного типа тоWrite (f,p)эквивалентно

beginp:=f; Put(f)end;

  • параметр pможет иметь видeилиe : mили e : m : n, гдеe–выражение, значение которого записывается в файл, аmиn–выражения целого типа (параметры размера поля); значение e может быть целого, отрезка целого, вещественного, булевского типа или строкой (последовательностью символов в кавычках-апострофах).

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

Выражение nопределяет размер дробной части и используется в случае, когдаеимеет вещественное значение и должно быть представлено в естественной форме. Если размер дробной части не задан, число представляется как десятичное в нормальной форме.

Значение ебулевского типа представляется стандартными именамиFalseиTrue. Строки выводятся без каких либо изменений. Ввод и вывод значений переменныхперечисляемого типапроцедурами ReadиWriteне поддерживается.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]