Буферизированный (потоковый) ввод-вывод. Часть 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 из предыдущей лекции.