- •Лабораторная работа №4 Виды файлов. Файловая переменная
- •Последовательность действий
- •Общие процедуры и функции
- •Текстовые файлы
- •Процедуры и функции для текстовых файлов
- •Стандартные текстовые файлы input и output
- •Структура модуля
- •Пример: Решим следующую несложную задачу. Пусть имеется два участка треугольной формы, обнесенных забором. Каким-то образом известны координаты вершин этих треугольников. Требуется определить:
- •Практическое задание Задания 1
Стандартные текстовые файлы input и output
Любой программе доступны без описания стандартные текстовые файловые переменные input и output. Input (ввод) — это доступный только по чтению файл, используемый для ввода с клавиатуры. Output (вывод) — доступный только по записи файл, используемый для вывода на дисплей. Чтобы убедиться, что такие файловые переменные действительно существуют, вы можете выполнить такую программу:
begin writeln(output,’Привет’); readln(input); end.
Перед началом выполнения программы файлы input и output автоматически открываются, как если бы были выполнены следующие операторы: assign(input,''); reset(input); и
assign(output,''); rewrite(output);
После выполнения программы эти файлы автоматически закрываются.
Файлы input и output и все файлы, которым присвоено пустое имя, ссылаются на устройство консоль. Конечно, имя con можно было бы записать и явно, но пустое имя короче.
Этими стандартными файлами можно с успехом пользоваться при работе с текстовыми файлами. Дело в том, что их можно связать и с любыми двумя текстовыми файлами на диске, и тогда процедуры read (readln) и write (writeln) будут работать не с консолью, как обычно, а с заданными файлами на диске, которые при этом будут автоматически открываться и закрываться.
Например:
Var a,b: integer;
begin
assign(input, 'input.txt'); {связали input с файлом input.txt }
readln(a,b); {прочитали две переменные из файла, а не с клавиатуры}
assign(output, 'output.txt'); { связали output с файлом output.txt }
writeln(b,a); {записали переменные в файл, а не вывели на экран}
end.
Если файл input.txt действительно содержит в первой строке два целых числа, то после выполнения программы в текущем каталоге появится файл output.txt, содержащий эти числа в обратном порядке. И никаких файловых переменных описывать не потребовалось. Неплохо?
Этой возможностью обычно пользуются на олимпиадах по программированию, поскольку при автоматической проверке задач исходные данные передаются программе из файла, а программа обязана послать результаты в другой файл, который и будет проверяться. При отладке программы, когда требуется работать с консолью, используют assign(input,''); assign(output,'');
Возможен и другой вариант — связать произвольную файловую переменную с консолью. Например:
var f : text; str: string;
begin
assign(f, ''); reset(f); readln(str); close(f);
assign(f, ''); rewrite(f); writeln(f, 'Вы ввели: ',str); close(f);
end.
Программа вводит данные с клавиатуры и выводит их на экран, хотя использует файловую переменную.
Пример Поиск в существующем файле все строки, содержащие набор символов, вводимых с клавиатуры. Результат поиска выводится на экран и одновременно записывается в файл с именем analysis.txt.
const sum: word=0; { счетчик: сколько раз нашли }
var f1,f2: text; name,str,search: string[80];
begin
write('Введите имя файла: '); readln(name);
write('Введите строку поиска: '); readln(search);
assign(f1,name);assign(f2,'analysis.txt');
reset(f1); rewrite(f2); { открываем f1 и создаем f2 }
writeln('Протокол поиска:'); writeln(f2,'Протокол поиска:');
while not eof(f1) do { пока не конец файла f1, выполняем цикл }
begin
readln(f1,str); { вводим строку str из файла f1 }
if pos(search,str)>0 then
begin { ищем search в str }
inc(sum); writeln('Найдено (раз):',sum);
writeln(str); { вывод на экран }
writeln(f2,str); { вывод в файл }
end;
end;
close(f1); close(f2); readln; { закрываем файлы }
end.
Пример: Ввод с клавиатуры, в начало заданного файла. Открытие файла для дозаписи процедурой append используется только в том случае, если текст добавляется в конец файла, поэтому нам пришлось создать временный файл (это типовой прием), в который сначала помещается добавляемый текст, а затем текст из заданного файла.
var ftmp,f: text; { файловые переменные }
txtbuf: string; { текстовый буфер }
name: string; { имя файла }
ok: boolean; ch: char;
function fileexists(filename : string): boolean;
{ если файл существует в текущем каталоге, функция возвращает true, }
var f: file;
begin
{$i-} assign(f, filename); reset(f); {$i+}
fileexists:=(ioresult=0)and(filename<>'');close(f);
end;
begin
{ запись текста во временный файл на диск }
assign(ftmp,'tmpfile.txt'); rewrite(ftmp);
writeln('Вводите текст для записи. Окончание - <Enter>:');
repeat
write('->'); readln(txtbuf); writeln(ftmp, txtbuf);
until txtbuf=''; { окончание текста — двойное нажатие <Enter> }
close(ftmp); writeln('Ввод окончен');
repeat { проверка существования файла }
write('Введите имя файла для добавления: '); readln(name);
ok:=fileexists(name);
if not ok then writeln('Файл ',name,' не найден');
until ok;
writeln('Файл ',name,' найден в текущем каталоге');
assign(f,name); reset(f); { открыли файл f }
append(ftmp); { текст из файла f добавляем в конец временного файла }
while not eof(f) do
begin
{ пустые строки читаются, но не записываются }
readln(f, txtbuf);
if txtbuf<>'' then writeln(ftmp,txtbuf);
end;
close(f); close(ftmp);
writeln('Введенный текст добавлен в начало файла ',name);
writeln('Сделайте выбор:');
writeln('Удалить старый файл, без резервной копии - E/e (erase)');
writeln('Удалить старый файл, создав bak-файл - B/b (backup)');
writeln('Выйти - H/h (halt)');
readln(ch);
case ch of
'E','e':
begin
{ удалили старый файл и переименовали временный }
erase(f); rename(ftmp,name);
end;
'B','b':
begin
txtbuf:=name; delete(txtbuf,length(txtbuf)-3,4);
rename(f,txtbuf+'.bak'); {переименовали старый файл в bak}
rename(ftmp,name); {переименовали временный файл}
end;
'H','h':halt;
end;
end.