Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Laboratornaya_rabota4-информатика.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
152.58 Кб
Скачать

Стандартные текстовые файлы 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.

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