На этом шаге мы рассмотрим особенности реализации стандартного вывода.
Объект cout направляет данные в буфер-поток, связанный с объектом stdout, объявленным в файле stdio.h. По умолчанию стандартные потоки С и C++ синхронизированы.
При выводе данные могут быть отформатированы с помощью функций-членов класса или манипуляторов. Их перечень приводится в таблице 1.
Манипуляторы | Функции-члены класса | Описание |
---|---|---|
showpos | setf(ios::showpos) | Выдает знак плюс у выводимых положительны: чисел |
noshowpos | unsetf(ios::showpos) | |
showbase | setf(ios::showbase) | Выдает базу системы счисления в выводимом числе в виде префикса |
noshowbase | unsetf(ios::showbase) | |
uppercase | setf(ios::uppercase) | Заменяет символы нижнего регистра на символы верхнего регистра в выходном потоке |
nouppercase | unsetf(ios::uppercase) | |
showpoint | setf(ios::showpoint) | Создает символ десятичной точки в сгенерированном потоке с плавающей точкой (в выводимом числе) |
noshowpoint | unsetf(ios::showpoint) | |
boolalpha | setf(ios::boolalpha) | Переводит булевый тип в символьный |
noboolalpha | unsetf(ios::boolalpha) | |
unitbuf | setf(ios::unitbuf) | Сбрасывает буфер вывода после каждой операции вывода |
nounitbuf | unsetf(ios::unitbuf) | |
internal | setf(ios::internal, ios::adjustfield) | Добавляет символы-заполнители к определенным внутренним позициям выходного потока (речь идет о выводе числа в виде потока символов). Если такие позиции не определены, поток не изменяется |
left | setf(ios::left, ios::adjustfield) | Добавляет символы-заполнители с конца числа (сдвигая число влево) |
right | setf(ios::right, ios::adjustfield) | Добавляет символы-заполнители с начала числа (сдвигая число вправо) |
dec | setf(ios::dec, ios::basefield) | Переводит базу вводимых или выводимых целых чисел в десятичную (введенные после этого манипулятора данные будут выводиться как десятичные) |
hex | setf(ios::hex, ios::basefield) | Переводит базу вводимых или выводимых целых чисел в шестнадцатеричную (введенные после этого манипулятора данные будут выводиться как шестнадцатеричные) |
oct | setf(ios::oct, ios::basefield) | Переводит базу вводимых или выводимых целых чисел в восьмеричную (введенные после этого манипулятора данные будут выводиться как восьмеричные) |
fixed | setf(ios::fixed, ios::floatfield) | Переводит выход с плавающей точкой в выход с фиксированной точкой |
scientitic | setf(ios::scientific, ios::floatfield) | Выдает числа с плавающей точкой в виде, используемом в научных целях: например, число 23 450 000 будет записано как 23.45e6 |
setbase(int base) | Преобразует ввод целых чисел в тип base, где параметр base может быть одним из чисел 8, 10 или 16 | |
fill(c) | setfill(char_type c) | Задает символ заполнения при выводе данных |
precision(n) | setprecision(int n) | Задает точность вывода дан ных (количество цифр после точки) |
setw(int n) | width(n) | Задает ширину поля для выводимых данных (количество символов) |
endl | Вставляет символ новой строки ('\n') в выходную последовательность символов и сбрасывает буфер ввода | |
ends | Вставляет символ '\0' в выходную последовательность символов | |
flush | flush() | Сбрасывает буфер вывода |
ws | Задает пропуск пробелов при вводе |
Значения по умолчанию:
Ниже приведен пример программы с применением объекта сout (все пояснения можно найти в комментариях). Результат работы программы представлен на рисунке 1.
// 95_1.cpp: главный файл проекта. #include "stdafx.h" #include <iostream> #include <iomanip> //включение манипуляторов #include <conio.h> #include <clocale> //обязательно для функции setlocale() using namespace System; using namespace std; void main() { setlocale(LC_ALL, "Russian"); //функция setlocale() с аргументами //для корректного вывода кириллицы int i; float f; cout << "Задайте значения i и f >" << endl; // чтение целого числа и числа с плавающей точкой с устройства stdin cin >> i >> f; // вывод целого и переход на новую строку cout << "Вывод целого числа: " << i << endl; // вывод числа с плавающей точкой и переход на новую строку cout << "Вывод числа с плавающей точкой: " << f << endl; // вывод в шестнадцатеричной системе счисления cout << "Вывод целого числа в шестнадцатеричной системе счисления: " << hex << i << endl; // вывод в восьмеричной и десятичной системах счисления cout << "Вывод целого числа в восьмеричной и десятичной системах счисления: " << oct << i << " " << dec << i << endl; // вывод i с указанием его знака cout << "Вывод целого числа со знаком: " << showpos << i << endl; // вывод i в шестнадцатеричной системе счисления cout << "Вывод целого числа в шестнадцатеричной системе счисления: " << setbase(16) << i << endl; // вывод i в десятичной системе счисления и // дополнение справа символом @ до ширины в 20 // символов (заполнение начинается от правой границы к левой). // Если вы введете, например, 45, то выведется 45@@@@@@@@@@@@@@@@@@ cout << "Форматный вывод целого числа: " << setfill('@') << setw(20) << left << dec << i << endl; // вывод того же результата в том же формате, // но с использованием функций вместо манипуляторов cout << "Форматный вывод целого числа (2-й способ): "; cout.fill('@'); cout.width(20); cout.setf(ios::left, ios::adjustfield); cout.setf(ios::dec, ios::basefield); cout << i << endl; // вывод f в научной нотации с точностью 10 цифр cout << "Вывод в научной нотации (точность 10 цифр): " << scientific << setprecision(10) << f << endl; // изменение точности до 6 цифр cout << "Вывод в научной нотации (точность 6 цифр): "; cout.precision(6); // вывод f и возврат к нотации с фиксированной точкой cout << f << fixed << endl; _getch(); }
Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим стандартный ввод cin.