Буферизированный (потоковый) ввод-вывод. Часть III
8.1. Вывод в стандартные потоки ошибок и печати
8.1.1. Вывод средствами языка Си
Вывод данных в стандартный поток ошибок и поток печати на языке Си осуществляется при помощи функций файлового ввода-вывода. При этом операции открытия-закрытия файла не нужны, а в качестве выходного потока указываются:
- для стандартного потока ошибок - значение stderr ;
- для потока печати - stdprn ;
Функции ввода-вывода с "явным" указанием потоков
В качестве функций языка Си, предназначенных для ввода-вывода с "явным" указанием потока, используются следующие функции:
- fscanf - для "форматированного ввода" значений из входного потока данных;
- fgets - для чтения из потока строки символов указанной длины Максимальная длина строки указывается в параметрах функции;
- getc - для чтения одиночного символа из потока ввода;
- fread - для "неформатированного ввода" данных (как "текстовых", так и "двоичных") из входного потока. На языке Си эта функция является единственной, которая может читать "не преобразованные двоичные" данные с любого "двоичного" потока (прежде всего - для двоичных файлов);
- fprintf - для "форматированного вывода" данных в указанный выходной поток. При этом "двоичные" данные преобразуются в текстовые данные, в соответствии со строкой формата;
- fputs - для записи строки, состоящих из текстовых символов, в выходной поток данных. Ограничение на длину символов не накладывается. Эта функция эффективно работает только с текстовыми файлами;
- putc - для записи одиночного символа в выходной поток;
- fwrite - для "неформатированного вывода" данных (как "текстовых", так и "двоичных") в выходной поток. На языке Си эта функция - единственная, которая может записывать "не преобразованные двоичные данные" в поток (прежде всего, для двоичных файлов).
Функции "форматированного ввода-вывода" в текстовый буфер:
- sscanf - для "форматированного ввода" значений из входного текстового буфера. При этом текстовые данные преобразуются в двоичные (в соответствии со строкой формата) и присваиваются как значения переменным. Данная функция работает "правильнее" и "безопаснее" соответствующих функций потокового ввода, может применяться для ввода с использованием "библиотек API высокого уровня". Именно поэтому автор рекомендует её использование при вводе форматированных значений;
- sprintf - для "форматированного вывода" значений в выходной текстовый буфер. При этом двоичные значения переменных преобразуются в текстовые данные (в соответствии со строкой формата) и выводятся в буфер. Данная функция работает "правильнее" и "безопаснее" соответствующих функций потокового вывода, может применяться для вывода с использованием "библиотек API высокого уровня". Именно поэтому автор рекомендует её использование при выводе форматированных значений;
Описание функций sscanf и sprintf смотри в приложении №№ I и II (6.4 и 6.5) к "Буферизированный (потоковый) ввод-вывод" данного курса.
Конкретные параметры и особенности работы для каждой функции смотри в приложении №1 (8.4) к данной лекции.
8.1.2. Вывод средствами языка C++
Для вывода данных в стандартный поток ошибок в языке C++ используются те же средства, что и для вывода в "стандартный поток вывода". Только при этом вместо переменной cout используется переменная cerr.
Стандартными средствами языка C++ невозможно вывести данные на принтер. Для этого вывода необходимо использовать средства языка Си.
8.1.3. Вывод средствами языка Basic
Для вывода информации из программы на языке Quick Basic на печать используются операторы LPRINT и LPRINT USING.
ОПЕРАТОР | LPRINT USING |
НАЗНАЧЕНИЕ: | Форматированный вывод списка числовых и символьных переменных, выражений и литералов на принтер, подключённый к порту LPT1. Формат выводимых выражений определяется строкой формата: formatstring$ ; |
СИНТАКСИС: |
LPRINT USING formatstring$; expressionlist [{; | ,}], где
|
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Средствами языка Quick Basic нет возможности вывести данные в стандартный поток ошибок - доступен только поток stdout.
8.1.4. Вывод средствами языков Perl и Python
Для вывода в стандартный поток ошибок на языке Perl используется предопределённый дескриптор: STDERR, который передаётся функции print для вывода текста. Например:
Пример 8.1.
# Вывод строки "Ошибка" в стандартный поток ошибок print STDERR "Ошибка";
Также для вывода текста в стандартный поток ошибок используется функция warn. Её описание смотри ниже:
ФУНКЦИЯ: | WARN |
ОПРЕДЕЛЕНА В: | Везде; |
СИНТАКСИС: |
warn СПИСОК warn |
НАЗНАЧЕНИЕ: | Вывод в стандартный поток ошибок; |
ОПИСАНИЕ: | Выводит в стандартный поток ошибок STDERR значения элемента списка, определяемого параметром: СПИСОК. Если он пуст, то выводится содержимое специальной переменной: $@ (обычно после выполнения функции: eval() ), добавляя строку: "\t…caught", а если и она пуста, то выводит сообщение: "Warning: Something's wrong" ; |
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет; |
Для вывода в стандартный поток ошибок на языке Python используется предопределённый дескриптор: sys.stderr, который передаётся функции write для вывода текста. Например:
Пример 8.2.
# Присвоению переменной значения дескриптора sys.stderr f = sys.stderr # Вывод строки "Ошибка" в стандартный поток ошибок f.write( 'Ошибка' )
Средствами языка Perl и Python невозможен вывод данных в стандартный поток печати.
8.1.5. Вывод средствами языка Turbo Prolog
Средствами языка Turbo Prolog невозможно вывести данные ни в стандартный поток ошибок, ни в стандартный поток печати (по крайней мере, автору они не известны).
8.1.6. Вывод средствами языка Visual Basic Script
Для вывода текста в стандартный поток ошибок на языке Visual Basic Script используются те же функции, что и в стандартный поток вывода. При этом в конструкции поток StdOut необходимо заменить потоком StdErr. Более подробно смотри пункт 7.1.7 "Буферизированный (потоковый) ввод-вывод. Часть II" данного курса.