Текстовые файлы
Текстовые файлы предназначены для хранения текстовой информации. Именно в таких файлах хранятся, например, исходные тексты программ. Компоненты текстовых файлов могут иметь переменную длину, что существенно влияет на характер работы с ними. Доступ к каждой строке текстового файла Паскаля возможен лишь последовательно, начиная с первой. К текстовым файлам применимы процедуры assign, reset, rewrite, read, write и функция eof. При создании текстового файла в конце каждой записи (строки) ставится специальный признак EOLN(end of line – конец строки). Для определения достижения конца строки существует одноименная логическая функция EOLN(<имя_ф_переменной>), которая принимает значение true, если конец строки достигнут.
Кроме процедур read и write при работе с текстовыми файлами используются их разновидности readln и writeln. Отличие заключается в том, что процедура writeln после записи заданного списка записывает в файл специальный маркер конца строки. Этот признак воспринимается как переход к новой строке. Процедура readln после считывания заданного списка ищет в файле следующий признак конца строки и подготавливается к чтению с начала следующей строки.
Пример решения задачи с файлами
Пусть нам необходимо сформировать текстовый файл, а затем переписать из данного файла во второй только те строки, которые начинаются с буквы «А» или «а».
Решение: нам понадобятся две файловые переменные f1 и f2, поскольку оба файла текстовые, то тип переменных будет text. Задача разбивается на два этапа: первый – формирование первого файла; второй – чтение первого файла и формирование второго, затем вывод на экран содержимого второго файла.
Program primer;
Var f1,f2:text;
I,n: integer;
S: string;
Begin
{формируем первый файл}
Assign(f1, ‘file1.txt’); {устанавливаем связь файловой переменной с физическим файлом на диске}
Rewrite(f1); {открываем файл для записи}
Readln(n) {определим количество вводимых строк}
for i:=1 to n do
begin
readln(s); {вводим с клавиатуры строки}
writeln(f1,s); {записываем последовательно строки в файл}
end;
close(f1); {заканчиваем работу с первым файлом, теперь на диске существует файл с именем file1.txt, содержащий введенные нами строки. На этом программу можно закончить, работу с файлом можно продолжить в другой программе, в другое время, но мы продолжим}
{часть вторая: чтение из первого файла и формирование второго}
Reset(f1); {открываем первый файл для чтения}
Assign(f2, ‘file2.txt’); {устанавливаем связь второй файловой переменной с физическим файлом}
Rewrite(f2); {открываем второй файл для записи}
{Дальше необходимо последовательно считывать строки из первого файла, проверять выполнение условия и записывать нужные строки во второй файл. Для чтения из текстового файла рекомендуется использовать цикл по условию «пока не конец файла»}
While not eof(f1) do
Begin
Readln(f1,s);{считываем очередную строку из первого файла}
If (s[1]=’A’) or (s[1]=’a’) then
Writeln(f2,s); {записываем во второй файл строки, удовлетворяющие условию}
End;
Close(f1,f2); {заканчиваем работу с файлами}
{часть третья: выводим на экран второй файл}
Writeln;
Writeln(‘Второй файл содержит строки:’);
Reset(f2); {открываем второй файл для чтения}
While not eof(f2) do {пока не конец второго файла}
Begin
Readln(f2,s);{считываем очередную строку из второго файла}
Writeln(s); {выводим строку на экран}
End;
End.
Задача 1: Дан текстовый файл. Посчитать количество строк в файле.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), насчитывая на каждом шаге считывания значение переменной-счетчика k;
- Вывести на экран значение переменной-счетчика;
- Закрыть файл.
program z1;
var k:integer;
s:string;
f:text;
begin
assign(f,'input.pas');
reset(f);
k:=0;
while not eof(f) do begin
readln(f,s); k:=k+1;end;
writeln('k=',k);
close(f);
end.
Задача 2: Дан текстовый файл. Напечатать все его строки, начинающиеся с символа «Т».
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: первый символ равен «Т», и если да, то вывести эту строку на экран;
- Закрыть файл.
program z2;
var k:integer;
s:string;
f:text;
begin
assign(f,'input.pas');
reset(f);
while not eof(f) do begin
readln(f,s);
if s[1]=’T’ then writeln(s);
end;
close(f);
end.
Задача 3: Дан текстовый файл. Напечатать все его строки, содержащие более 30 символов.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: длина строки больше 30, и если да, то вывести эту строку на экран;
- Закрыть файл.
program z3;
var k:integer;
s:string;
f:text;
begin
assign(f,'input.pas');
reset(f);
while not eof(f) do begin
readln(f,s);
if length(s)>=30 then writeln(s);
end;
close(f);
end.
Задача 4: Дан текстовый файл. Напечатать все его строки, содержащие в качестве фрагмента заданный текст.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas;
- Открыть файл для чтения;
- Задать фрагмент текста для поиска (s1);
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), проверяя на каждом шаге, удовлетворяет ли строка условию: в ней содержится в качестве фрагмента заданный текст (s1), и если да, то вывести эту строку на экран;
- Закрыть файл.
program z4;
var k:integer;
s1,s:string;
f:text;
begin
writeln(‘введи фрагмент текста’);
readln(s1);
assign(f,'input.pas');
reset(f);
while not eof(f) do begin
readln(f,s);
if pos(s1,s)<>0 then writeln(s);
end;
close(f);
end.
Задача 5: Дан текстовый файл. Напечатать 5 строку в новый текстовый файл, а остальные на экран.
Составим алгоритм решения задачи (Создать текстовый файл данных – input.pas до начала решения задачи):
- Связать логический файл f с физическим файлом input.pas, а логический файл g с физическим файлом output.pas;
- Открыть файл для чтения;
- Организовать считывание данных из файла построчно (readln(f,s), где s-переменная типа string), насчитывая на каждом шаге считывания значение переменной-счетчика k, и, проверяя на каждом шаге, равно ли значение счетчика 5, и если да, то вывести эту строку в файл g, иначе вывести на экран;
- Закрыть файл.
program z5;
var k:integer;
s:string;
f,g:text;
begin
assign(f,'input.pas');
reset(f);
assign(g,'output.pas');
rewrite(g);
k:=0;
while not eof(f) do begin
readln(f,s);k:=k+1;
if k=5 then writeln(g,s);
end;
close(f); close(f);
end.