Текстовый файл можно рассматривать как последовательность символов, разбитую на строки длиной от 0 до 255 символов. Для описания используется стандартный тип Text:
Var < файловая переменная>: text;
Каждая строка завершается маркером конца строки. На практике такой маркер представляет собой последовательность из двух символов: перевод строки chr(13) и возврат каретки chr(10). Эти два символа задают стандартные действия по управлению текстовыми файлами. Стандартно открываемые предопределенные файлы Input и Output в модуле System имеют тип Text
У текстовых файлов своя специфика. Специальные расширения стандартных процедур чтения Read и записи Write разрешают работать со значениями несимвольного типа. Другими словами, последовательность символов автоматически преобразуется к значению того типа переменной, которая используется в файловых операциях.
Вызов Read(F, W), где W — переменная типа word, осуществляет чтение из файла F последовательности цифр, которая затем интерпретируется в число, значение которого и будет присвоено переменной W. В случае если вместо последовательности цифр идет любая другая последовательность символов, использование такого оператора приводит к ошибке выполнения программы.
Открытие текстового файла можно произвести двумя стандартными способами:
1. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть новый текстовый файл (процедура Rewrite);
2. поставить в соответствие файловой переменной имя файла (процедура Assign), открыть уже существующий файл (процедура Reset).
Текстовый файл в силу своей специфики во время работы допускает какой-либо один вид операции: чтение или запись. В связи с этим для работы с текстовыми файлами появляется еще одна процедура открытия файла:
Append(<файловая переменная>);
Эта процедура открывает уже существующий файл и позиционирует указатель обработки на конец файла. После такого открытия текстовый файл можно только дополнять информацией, начиная с конца строки. Ограничения, накладываемые на процедуру Append, такие же, как у процедур Reset и Rewrite.
Для обработки текстовых файлов используются процедуры Read и Write, обеспечивающие соответственно чтение и запись одной строки и более в текстовый файл. Использование специальных разделителей строк файла позволило ввести в состав языковых средств процедуры Readln. Процедура Read обеспечивает ввод данных общим потоком из одной строки, a Readln приводит к обязательному переходу к следующей строке текстового файла, т.е. ввод данных осуществляется из различных строк. Writeln, обеспечивающую запись всех величин с обязательной установкой маркера конца строки в файл. Общий вид представления процедур следующий:
Readln(var F : text; VI [,V2,.. .Vn]) ;
Writeln(var F : text; VI [,V2,. . .Vn]) ;
где VI...Vn переменные разных типов.
При организации операций ввода-вывода используются специальные языковые средства в виде функций Eoln, Eof
Функция Eof(var F: text) возвращает булевское значение True, если указатель конца файла находится сразу за последним компонентом, и False — в противном случае.
Функция Eoln(var F: text) возвращает булевское значение True, если текущая файловая позиция находится на маркере конца строки или вызов Eof(F) возвратил значение True. Во всех других случаях значение функции будет False.
Задачи:
1. Дан файл «Primer.txt» вывести на экран его содержимое.
program _;
uses crt;
var f: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f,'primer.txt');
reset(f);
while not eof(f) do
begin
Readln(f,a);
writeln(a) ;
end;
close(f);
end.
2. Дан файл «Work.txt» при выводе файла на экран заменить все цифры на «*».
program _;
uses crt;
var f: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f,'work.txt');
reset(f);
while eof(f) do
begin
Readln(f,a);
For i:= 1 to length(a) do
If (a[i]>=’0’) and (a[i]<=’9’) then a[i]:=’*’;
writeln(a) ;
end;
close(f);
end.
3. Создать свой текстовый файл, поместить в него заглавные русские буквы.
program _;
uses crt;
var f: text;
a, nane:string;
i,k: byte;
begin
Writeln(‘введите имя создаваемого файла’);
Readln(name);
assign(f,name);
rewrite(f);
for i:=128 to 159 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
close(f);
end.
4. Дан файл, заполненный заглавными русскими буквами, дописать в него маленькие русские буквы.
program _;
uses crt;
var f: text;
a,name:string;
i,k: byte;
begin
clrscr;
Writeln(‘введите имя файла, в который будем дописывать ’);
Readln(name);
assign(f,name);
append(f);
for i:=160 to 175 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
for i:=224 to 239 do
begin
write(f,chr(i):3) ;
k:=k+1;
if k=16 then
begin
writeln(f);
k:=0;
end;
end;
close(f);
end.
5. Написать программу, обеспечивающую создание на диске текстового файла и запись в него.
Program _;
uses crt;
var f:text;
new, name: string;
s: char;
i:integer;
begin
clrscr;
Writeln(‘введите имя создаваемого файла’);
Readln(name);
assign(f,name);
rewrite(f);
writeln('введи текст, для завершения нажми enter');
repeat
readln(new);
write(f,new);
until new=’’;
close(f);
end.
6. Скопировать содержимое одного файла в другой.
program _;
uses crt;
var f1,f2: text;
a:string;
i,k: byte;
begin
clrscr;
assign(f1,'work.txt');
assign(f2,'we.txt');
reset(f1);
rewrite(f2);
while not eof(f1) do
begin
readln(f1,a) ;
writeln(f2,a) ;
end;
close(f1);
close(f2);
end.
Использование буфера ввода-вывода. Рассмотрим процедуру обмена информацией между программой и внешним текстовым файлом на диске. Для передачи данных используется буфер ввода-вывода в виде участка оперативной памяти, через который осуществляются все операции обмена. Для языка Паскаль стандартный буфер ввода-вывода имеет объем 128 байт. Каждому открытому файлу вместе с обработчиком назначается и свой буфер. Возникает задача оптимизации обращения к внешним носителям информации.
Например, процедура Writeln записывает все данные последовательно в буфер, физическая запись на внешнее устройство происходит только тогда, когда информацией будет занят последний байт буфера. После записи на диск буфер освобождается для приема следующей порции информации. Таким образом, достигается компромисс между количеством и длительностью обращений к диску. Если бы каждый вызов процедуры Writeln приводил на практике к физическому обращению к диску, то тратилось бы непозволительно много времени на позиционирование головки чтения-записи для доступа к файлу.
Специально введенная процедура Flush(<файловая переменная>) дает возможность связать запись с помощью процедур Write и Writeln непосредственно с физической записью на диск. Вызов процедуры гарантирует, что все символы, переданные для записи, действительно в это же время будут записаны во внешний файл. Использовать процедуру можно для текстовых файлов, открытых только для записи процедурами Rewrite и Append. В прикладных программах процедуру используют редко, как правило, в тех случаях, когда необходимо подтверждение о физической записи во внешний файл
Процедура SetTextBuf (<файл. переменной>;Buf[; size])- дает возможность назначить свой буфер ввода-вывода (Buf) необходимого объема (Size) текстовому файлу. Параметр Size при вызове может быть опущен. В этом случае размер буфера соответсвует SizeOf(Buf). Назначение SetTextBuf файловой переменной распространяется до следующего использования переменной новым внешним файлом.
Пример: Назначение буфера ввода-вывода.
var F: text;
Ch: char;
Buf: array[1..2048] of char; {Буфер 2 Кбайта}
begin
Assign(F,’primer.txt’);
SetTextBuf(F, Buf);{Установить файлу буфер 2 Кбайта}
Reset(f);
while not Eof(F) do
begin {Вывести файл на экран}
Read(F, Ch); ц
Write(Ch);
end;
end.
Потери информации при обмене будут исключены, если переназначение буфера ввода-вывода будет осуществлено после вызова процедуры Assign либо сразу после процедур открытия файлов до любой операции обмена.