Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2011_12 Комп.Науки_2сем.doc
Скачиваний:
4
Добавлен:
13.09.2019
Размер:
476.67 Кб
Скачать

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

17.6.1.Структура текстового файла

строка

Eoln

строка

Eoln

......

строка

Eof

Текстовый файл – это последовательность строк различной длины. Каждая строка состоит из кодов символов, заканчивается признаком конца строки Eoln (End of line, это символ #13 «возврат каретки» и символ #10 «перевод строки»). В конце файла признак конца файла Eof (End of file). Если два признака Eoln или Eoln и Eof идут подряд, это воспринимается как пустая строка. Например, текст

в текстовом файле будет представлен в следующем виде:

В строке файла отдельные слова и символьные представления чисел разделены пробельными символами: символом пробела #32 и символом табуляции #9.

17.6.2.Особенности открытия текстовых файлов

Для одного текстового файла нельзя одновременно читать и писать:

  1. Reset открывает текстовый файл только для чтения;

  2. Rewrite открывает новый (пустой) файл только на запись;

  3. Append открывает файл для записи в конец файла.

procedure Append(F)

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

Файловый указатель устанавливается на конец файла. Если файл не существует, он создается.

Таким образом, писать можно либо в пустой текстовый файл, либо в конец существующего файла после уже имеющихся в файле данных. При необходимости изменить характер работы с текстовым файлом (например, после записи в файл прочитать его содержимое) надо его закрыть и заново открыть процедурой Reset.

17.6.3.Особенности чтения и записи для текстовых файлов

Особенности состоят в следующем:

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

  2. Процедуры Write и Writeln допускают запись в файл значений только целых, вещественных, символьных, строковых и булевских типов. При записи числовых значений они предварительно преобразуются в символьное представление, а логические значения – в строковые аналоги TRUE или FALSE. При записи нескольких значений в одну строку файла их надо разделять пробельными символами.

  3. Для записываемого значения любого типа можно указать ширину поля вывода, т.е. количество символов в символьном представлении, например, write(x:6). Если ширина поля больше количества символов в представлении, слева добавляются пробелы. При записи вещественных чисел можно указать ширину поля вывода и количество знаков после десятичной точки: например, write(x:8:5), выводимое число округляется.

  4. Только для текстовых файлов можно использовать процедуры Readln и Writeln. Процедура Readln после чтения пропускает оставшиеся непрочитанными символы текущей строки файла до конца строки, признак конца строки Eoln и устанавливает файловый указатель после Eoln (на начало следующей строки или на признак Eof конца файла). Процедура Writeln после выведенных символов записывает признак конца строки Eoln (символы #13 и #10) и устанавливает файловый указатель после него на конец файла.

Пример. Пусть имеются переменные следующих типов, которым присвоены значения:

Тип переменной

i:integer

b:boolean

c:char

r:real

Значение переменной

i:=123

b:=true

c:=’+’

r:=45.678

Количество байт памяти

4 байта

1 байт

1 байт

8 байт

После записи оператором writeln(F,i,b,c,r:7:2) в файле F получим следующую строку:

1

2

3

t

r

u

e

+

#32

#32

4

5

.

6

8

#13

#10

Значение r занимает 7 байтов, согласно формату вывода слева добавлено два пробела и произошло округление.

В памяти числовые и логические значения занимают фиксированное количество байтов независимо от количества цифр в числах и логического значения. В текстовом файле количество байтов зависит от количества цифр и формата вывода.

17.6.4.Дополнительные подпрограммы, учитывающие наличие строк и пробельных символов

Проверки конца строки

function Eoln(F):boolean

Возвращает значение True, если файловый указатель находится на признаке конца строки файла.

В противном случае возвращает False.

Поиск конца строки

function SeekEoln(F):boolean

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

Поиск конца файла

function SeekEof(F):boolean

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

17.6.5.Построчная обработка текстовых файлов

При построчной обработке строка файла целиком считывается из файла оператором Readln(F,s) в строковую переменную. Для проверки конца файла используется функция Eof. Чтение оператором Read(F,s) приводит к зацикливанию, т.к. не происходит перехода к новой строке файла.

17.6.6.Поэлементная обработка текстовых файлов, состоящих из чисел

Числа в текстовых файлах разделяются пробельными символами и признаками конца строк. При организации ввода из файла надо учитывать различные варианты наличия или отсутствия:

  • пробельных символов за последним числом в строке;

  • строк только из пробельных символов (без чисел);

  • признака конца последней строки непосредственно перед признаком конца файла.

Использование функций SeekEoln и SeekEof позволяет учесть все эти варианты в одной программе. Эти функции как раз и предназначены для пропуска пробельных символов. Замена их на Eoln и Eof в разных сочетаниях приводит либо к зацикливанию программы, либо к ошибке ввода.

Пример. В редакторе БЛОКНОТ подготовлен текстовый файл matr.txt из нескольких строк. В начале строк, между числами и в конце строк есть пробелы и/или табуляция. Выдать номера строк и количество чисел в каждой строке.

var F: text; i,j,x: integer;

begin

Assign(F, 'matr.txt');

Reset(F);

i:=0; //Счетчик строк

while not SeekEof(F) do //Внешний цикл до конца файла

begin

i:=i+1;

j:=0; //Счетчик чисел в строке

while not SeekEOLn(F) do //Внутренний цикл до конца строки

begin

read(F, x);

j:=j+1

end;

writeln('Строка ',i, ', чисел ',j)

end;

Close(F); end.

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

while not SeekEof(F) do //Цикл до конца файла

begin

read(F, x);

. . . //Обработка числа

end;

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