Опубликован: 15.11.2010 | Доступ: свободный | Студентов: 745 / 44 | Оценка: 4.00 / 5.00 | Длительность: 17:30:00
Специальности: Программист
Лекция 8:

Буферизированный (потоковый) ввод-вывод. Часть 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
НАЗНАЧЕНИЕ: Вывод списка числовых и символьных переменных, выражений и литералов на принтер, подключённый к порту LPT1;
СИНТАКСИС: LPRINT [expressionlist] [{; | ,}], где
  • expressionlist - список из одной или более числовых или символьных выражений, выводимых на печать;
  • {; | ,} - разделители, применяемые к выводу следующего выражения и означающие следующее:
    • ; - означает печать сразу после вывода предыдущего выражения;
    • , - означает печать следующего выражения сначала следующей "зоны вывода";
    • <пусто> - означает вывод с новой строки;
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: Нет.
ПРИМЕЧАНИЕ: в Quick Basic зона печати имеет ширину в 14 символов.

ОПЕРАТОР LPRINT USING
НАЗНАЧЕНИЕ: Форматированный вывод списка числовых и символьных переменных, выражений и литералов на принтер, подключённый к порту LPT1. Формат выводимых выражений определяется строкой формата: formatstring$ ;
СИНТАКСИС: LPRINT USING formatstring$; expressionlist [{; | ,}], где
  • formatstring$ - текстовая строка, содержащая в себе один или более "опций формата". Её формат смотрите в таблице 7.1 к "Буферизированный (потоковый) ввод-вывод. Часть II" ;
  • 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" данного курса.