Системное программирование в UNIX средствами Free Pascal

       

Стандартный ввод, стандартный вывод и стандартный вывод диагностики


Стандартная библиотека ввода/вывода обеспечивает две структуры TFILE, связанные со стандартным вводом и стандартным выводом, и переменная типа TEXT, связанная со стандартным выводом диагностики. (Еще раз напомним, что не следует путать эти потоки с одноименными дескрипторами ввода/вывода 0, 1 и 2.) Эти стандартные структуры не требуют открытия и задаются предопределенными указателями:

stdin                Соответствует стандартному вводу

stdout              Соответствует стандартному выводу

stderr              Соответствует стандартному выводу диагностики

Следующий вызов получает очередной символ из структуры stdin, которая так же, как и дескриптор файла со значением 0, по умолчанию соответствует клавиатуре:

inchar := getc (stdin);

Так как ввод и вывод через потоки stdin и stdout используются очень часто, для удобства определены еще две процедуры – getchar и putchar. Процедура getchar возвращает очередной символ из stdin, а процедура

putchar выводит символ в stdout. Они аналогичны процедурам getc и putc, но не имеют аргументов.

Следующая программа io2 использует процедуры getchar и putchar для копирования стандартного ввода в стандартный вывод:

(* Программа io2 - копирует stdin в stdout *)

uses stdio;

var

  c:integer;



begin

  c := getchar;

  while c <> EOF do

  begin

    putchar (c);

    c := getchar;

  end;

end.

Программа io2 ведет себя почти аналогично приведенному ранее примеру – программе io

из главы 2.

Так же, как getc и putc, getchar и putchar могут быть макросами. Фактически getchar часто просто определяется как getс(stdin), a putchar – как putc(stdout).

stderr обычно предназначена для вывода сообщений об ошибках, поэтому вывод в stderr обычно не буферизуется. Другими словами, символ, который посылается в stderr, будет немедленно записан в файл или устройство, соединенное со стандартным выводом диагностики. При включении отладочной печати в код для тестирования рекомендуется выполнять вывод в stderr. Вывод в stdout буферизуется и может появиться через несколько шагов после того, как он в действительности произойдет. (Вместо этого можно использовать процедуру fflush(stdout) после каждого вывода для записи всех сообщений из буфера stdout.)[18]

Упражнение 11.4. При помощи стандартной команды time сравните производительность программы io2 и программы io, разработанной в главе 2. Измените исходную версию программы io так, чтобы она использовала вызовы fdread и fdwrite для посимвольного ввода и вывода. Снова сравните производительность полученной программы и программы io2.

Упражнение 11.5. Перепишите программу io2 так, чтобы она более соответствовала команде cat. В частности, сделайте так, чтобы она выводила на экран содержимое файлов, заданных в качестве аргументов командной строки. При отсутствии аргументов она должна принимать ввод из stdin.



Содержание раздела