Особенности работы с текстовыми файлами
Текстовые файлы связываются с файловыми переменными, принадлежащими стандартному типу text. Текстовые файлы предназначены для хранения текстовой информации. Именно в такого типа файлах хранятся, исходные тексты программ. Компоненты (записи) текстового файла могут иметь переменную длину, что существенно влияет на характер работы с ними.
Текстовый файл трактуется в Турбо Паскале как совокупность строк переменной длины. Доступ к каждой строке возможен лишь последовательно, начиная с первой. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN (End Of LiNe – конец строки), а в конце всего файла – признак EOF (End Of File – конец файла). Эти признаки можно протестировать одноименными логическими функциями (см. далее).
Для доступа к записям применяются процедуры Read, ReadLn, Write, WriteLn.Они отличаются возможностью обращения к ним с переменным числом фактических параметров, в качестве которых могут использоваться символы, строки и числа. Первым параметром в любой из перечисленных процедур должна быть файловая переменная.
Процедура Read. Обеспечивает ввод символов, строк и чисел. Формат обращения:
Read (<файловая переменная>,<сп.ввода>)
Здесь <сп.ввода> – список ввода: последовательность из одной или более переменных типа char, string, а также любого целого или вещественного типа.
При вводе переменных типа charвыполняется чтение одного символа из файла и присваивание считанного значения переменной. Если перед выполнением чтения указатель файла достиг конца очередной строки, то результатом чтения будет символ CR(ASCII код #13), а если достигнут конец файла, то – символ EOF(код #26).
При вводе переменных типа stringколичество считанных процедурой и помещенных в строку символов равно максимальной длине строки, если только раньше не встретились символы CR или EOF. В этом случае сами символы CR и EOF в строку не помещаются. Если количество символов во входном потоке данных больше максимальной длины строки, «лишние» символы до конца строки отбрасываются, а новое обращение к Read возвращает пустую строку. Таким образом, процедура Readне в состоянии прочесть последовательность строк: первая строка будет прочитана нормально, а все последующие окажутся пустыми. Для ввода последовательности строк нужно использовать процедуру ReadLn(см. ниже).
При вводе числовых переменных процедура Readвначале выделяет подстроку во входном потоке по следующему правилу: все ведущие пробелы, символы табуляции и маркеры конца строк EOLNпропускаются; после выделения первого значащего символа, наоборот, любой из перечисленных символов или символ EOFслужат признаком конца подстроки. Выделенная таким образом подстрока затем рассматривается как символьное представление числовой константы соответствующего типа и преобразуется во внутреннее представление, а полученное значение присваивается переменной. Если в подстроке был нарушен требуемый формат представления численной константы, возникает ошибка ввода-вывода. Если при пропуске ведущих пробелов встретился символ EOF, переменная получает значение 0.
Процедура Readпрекрасно приспособлена к вводу чисел. При обращении к ней за вводом очередного целого или вещественного числа процедура «перескакивает» маркеры конца строк, т.е. фактически весь файл рассматривается ею как одна длинная строка, содержащая текстовое представление чисел. В сочетании с проверкой конца файла функцией EOF процедура Readпозволяет организовать простой ввод массивов данных, например, так:
Const
N = 1000; {Максимальная длина ввода}
Var
f : text;
m : array[1..N] ofreal;
i : integer;
Begin
Assign(f, 'prog.dat');
Reset(f);
i := 1;
while notEOF(f) and(i <= N) do
Begin
Read(f,m[i]) ;
inc(i)
End;
Close(f);
end.
Процедура ReadLn. Обеспечивает ввод символов, строк и чисел. Эта процедура идентична процедуре Readза исключением того, что после считывания последней переменной оставшаяся часть строки до маркера EOLNпропускается, поэтому следующее обращение к ReadLnили Readначинается с первого символа новой строки. Кроме того, эту процедуру можно вызвать без параметра <сп.ввода>(см. процедуру Read), что приведет к пропуску всех символов текущей строки вплоть до EOLN.
Процедура Write. Обеспечивает вывод информации в текстовый файл. Формат обращения:
Write (<файловая переменная>, <сп.вывода>) или Write (<сп.вывода>)
Здесь <сп.вывода> – список вывода: последовательность из одного или более выражений типа char, string, boolean, а также любого целого или вещественного типа.
Символы и строки передаются выводному файлу без изменений.
При выводе логических выражений в зависимости от их значения выводятся строки trueили false. (Ввод логических констант процедурами ReadилиReadLnне предусмотрен).
Процедура WriteLn. Эта процедура полностью идентична процедуре Write за исключением того, что выводимая строка символов завершается кодами CRи LF. При вызове WriteLnможно опускать параметр <сп.вывода>; в этом случае в файл передается маркер EOLN, что при выводе на экран приведет к переводу курсора в начало следующей строки.
Логическая функция EOLN. Возвращает true, если во входном текстовом файле достигнут маркер конца строки. Формат обращения:
EOLN (<файловая переменная>)
Логическая функция SeekEOLN. Пропускает все пробелы и знаки табуляции до маркера конца строки EOLNили до первого значащего символ и возвращает true, если маркер обнаружен. Формат обращения:
SeekEOLN (<файловая переменная>)
Логическая функция SeekEOF. Пропускает все пробелы, знаки табуляции и маркеры конца строки EOLNдо маркера конца файла или до первого значащего символа и возвращает true, если маркер обнаружен. Формат обращения:
SeekEOF (<файловая переменная>)
В следующем примере, иллюстрирующем работу с текстовым файлом подсчитывается общее количество символов в файле и результат делится на 40000 – таким способом можно оценить объем рукописи в так называемых учетно-издательских листах:
Var
f: text;
s: String; const
Sum: Longlnt = 0; {Здесь будет количество символов}
Begin
Write('Имя файла: '); (Запрос... }
ReadLn(s); {и ввод имени файла}
Assign(f,s);
Reset(f); {Открытие файла}
while notEOF(f) do{Подсчет...}
begin(количества...}
ReadLn(f,s); {символов...}
inc(Sum, Length(s)) (в файле}
End;
Close(f); {Закрытие файла}
WriteLn('Объем = 1,Sum/40000:б:2,' уч.изд.л.');
End.
Дата добавления: 2017-01-29; просмотров: 1260;