Буферизированный (потоковый) ввод-вывод. Часть II
7.1. Вывод в стандартный поток вывода
7.1.1. Вывод средствами языка Си
Вывод в стандартный поток средствами языка Си осуществляется следующими функциями:
- форматированный вывод - функция printf ;
- вывод строки символов - функция puts ;
- вывод одиночного символа - функция putchar ;
- вывод одиночного символа в поток - функция putc ;
С синтаксисом этих функция можно ознакомиться в приложении №I (7.3) к данной лекции. Автор хочет отметить, что, в отличие от функций чтения консоли, вывод на консоль совершенно безопасен и не приводит к "зависанию" программ и ошибкам системы типа "переполнения буфера". Однако если Вы пишете программу-фильтр, которая будет интенсивно работать с "перенаправлением потоков", необходимо всё-таки использовать функции файлового вывода, указывая в качестве потока вывода поток "stdout".
Пример 7.1
/* File ex07001.c */ /* Пример вывода символов средствами языка Си */ #include <stdio.h> #include <string.h> #include <conio.h> #ifndef STR_LENGTH #define STR_LENGTH 5 // Длина строки 3 символа #endif void main() { char str[STR_LENGTH]; // Текстовый буфер char c, *s; // Временная переменна int icsize; // Временная переменна memset( str, '\0', STR_LENGTH ); // Обнуляем буфер icsize = STR_LENGTH; puts( "\nВведите строку символов длиной в 2 символа\n" ); s = fgets( str, icsize, stdin ); // Читаем не более 2 символов с входного потока // (вместе с нулевым символом) printf( "\nДлина строки: %2d символов,", strlen(s) ); //Выводим длину строки printf( "\nЗначение строки: %5s.", s ); // Выводим значение строки puts( "\nPress any key to continue..."); while( !(c = getch()) ); // Цикл пока не нажата клавиша }
7.1.2. Вывод средствами языка C++
Консольный потоковый вывод осуществляется при помощи оператора "<<" и функций: cout.put и cout.write. Стандартный поток ввода в языке C++ обозначается как cout (см. таблицу 6.1 к "Буферизированный (потоковый) ввод-вывод" ).
Описание функций для потокового ввода средствами языка C++ смотри в приложении №3 (6.6) к "Буферизированный (потоковый) ввод-вывод" .
C помощью оператора "<<" можно осуществить как неформатированный, так и форматированный ввод-вывод. Однако автор советует для вывода, с целью совместимости с выводом с использованием библиотек API, использовать неформатированный вывод в поток с помощью оператора, а данные для него подготовить при помощи функции sprintf (см. пример 7.2.).
Пример 7.2
/* File ex07002.cpp */ /* Файл иллюстрирует ввод-вывод средствами C++*/ /* Данный пример тестировался в системе программировани Borland C/C++ 3.10 */ #include <iostream.h> #include <stdio.h> #include <string.h> #include <conio.h> #ifndef NAME_LENGTH #define NAME_LENGTH 81 // Длина строки 80 символов + завершающий символ '\0' #endif #ifndef AGE_LENGTH #define AGE_LENGTH 81 // Длина строки 80 символов + завершающий символ '\0' #endif #ifndef OUTPUT_STR_LENGTH #define OUTPUT_STR_LENGTH 67 #endif void main( void ) { const char format_in[] = "%3d"; const char format_out[] = "Добрый день, %s!\nВаш возраст, %-.10s, - %3d лет"; // Формат вывода char name_length[NAME_LENGTH]; char cage[AGE_LENGTH]; char soutstr[OUTPUT_STR_LENGTH]; char ctemp, c; int temp; int iage; (void) memset( name_length, '\0', NAME_LENGTH ); // Обнуляем строку; (void) memset( soutstr, '\0', OUTPUT_STR_LENGTH ); cerr << "Введите своё имя: "; cin >> name_length; cerr << "Введите Ваш возраст: "; cin >> cage; if( !sscanf( cage, format_in, &iage ) ) // Если ошибка ввода { cerr << "\nНичего не введено или неправильный формат данных!\n"; return; } if( iage < 40 ) temp = sprintf( soutstr, format_out, "Молодой человек", name_length, iage ); else temp = sprintf( soutstr, format_out, "Папаша", name_length, iage ); if( temp == EOF ) // Если ошибка вывода { cerr << "\nНичего не выведено или неправильный формат данных!\n"; return; } cout << soutstr; // Выводим сформированную строку cerr << "\nПрограмма завершена нормально\n"; cerr << "\nPress any key to continue..."; while( !(c = getch()) ); // Цикл пока не нажата клавиша }
7.1.3. Вывод средствами языка Basic
Для вывода данных на языке Quick Basic используются операторы PRINT и PRINT USING. Их синтаксис следующий:
ОПЕРАТОР | |
НАЗНАЧЕНИЕ: | Вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея; |
СИНТАКСИС: |
PRINT [expressionlist] [{; | ,}], где
|
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
ПРИМЕЧАНИЕ: | в Quick Basic зона печати имеет ширину в 14 символов. |
ОПЕРАТОР | PRINT USING |
НАЗНАЧЕНИЕ: | Форматированный вывод списка числовых и символьных переменных, выражений и литералов на экран дисплея. Формат выводимых выражений определяется строкой формата: formatstring$ ; |
СИНТАКСИС: |
PRINT USING formatstring$; expressionlist [{; | ,}], где
|
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ: | Нет. |
Строка форматов Quick Basic для оператора PRINT USING | |
---|---|
Символ | Назначение |
Символы формата для числовых выражений | |
# | Позиция числа |
. | Позиция десятичной точки |
, | Запятая, помещённая слева от десятичной точки, печатает запятую перед каждой третьей цифрой |
$$ | Печатает знак доллара перед числом. |
+ | Позиция знака числа |
** | Заполняет предшествующие пробелы числа "звёздочками" |
- | Помещённый после числа, печатает trailing знак для отрицательных символов. |
^^^^ | Печатает числа в "научном" ("экспоненциальном") формате |
**$$ | Комбинация ** and $$. |
Символы, используемые для форматирования строковых выражений | |
& | Печатает всю строку |
\ \ | Печатает первые n символов, где n – число пробелов между чёрточками + 2 |
! | Печатает только первый символ строки |
Символы, используемые для печати литеральных символов | |
_ | Печатает следующий символ форматирования как литерал |
Любой символ не из этой таблицы печатается как литерал |
В качестве примера вывода текста средствами Quick Basic смотри пример 6.5 из предыдущей лекции.