В C++ ввод/вывод данных производится потоками, т. е. последовательностями байтов. При операциях ввода байты направляются от устройства (например, клавиатуры, дисковода, сетевой платы) в основную память. В операциях вывода поток байтов направляется из основной памяти на устройство (например, экран монитора, принтер, дисковод, сетевую плату).
Специфический смысл этим байтам придают прикладные программы. Байты могут представлять ASCII-символы, сырые данные внутреннего формата, графические изображения, оцифрованную речь, цифровое видео или любой другой вид информации, с которой работает приложение.
Системные механизмы ввода/вывода должны обеспечивать целостное и надежное перемещение байтов данных от устройств в память (и наоборот). Передача данных нередко связана с механическим движением, например, вращением магнитного диска, протяжкой ленты или нажатием клавиш на клавиатуре. Время, которое уходит на обмен данными с такими устройствами, обычно значительно превышает то, что требуется процессору на обработку этих данных. Поэтому операции ввода/вывода требуют тщательного планирования и настройки для того, чтобы обеспечивалась максимальная производительность системы.
В C++ имеются возможности ввода/вывода «низкого уровня» и «высокого уровня». Низкоуровневый, т. е. бесформатный ввод/вывод обычно состоит в передаче заданного числа байт от устройства в память или из памяти устройству. В таких операциях единицей информации является байт. Операции низкого уровня способны быстро передавать большие объемы информации, но в не слишком удобной для человека форме. Люди предпочитают пользоваться операциями ввода/вывода высокого уровня, т. е. форматируемым вводом/выводом, в котором байты группируются в осмысленные единицы данных вроде целых чисел, чисел с плавающей точкой, символов, строк и определяемых пользователем типов. Такой, ориентированный на тип, подход пригоден для большинства задач ввода/вывода, кроме обработки файлов большого объема. [1] Чтобы оптимизировать потоков ввод/вывода используются манипуляторы.
В C++ имеются различные манипуляторы потоков, которые служат задачам форматирования. Манипуляторы могут производить установку ширины поля, задание точности, установку и сброс флагов форматирования, задание символа-заполнителя, очистку потоков, передачу в выходной поток символа новой строки (со сбросом потока), передачу в выходной поток нуль-символа, пропуск пробельных символов во входном потоке. [1]
Поток ввода-вывода — это логическое устройство, предназначенное для приема и выдачи информации пользователю. Поток связан с физическим устройством с помощью системы ввода-вывода С++. [3]
Операции ввода/вывода выполняются с помощью классов istream (потоковый ввод) и ostream (потоковый вывод). Третий класс, iostream, является производным от них и поддерживает двунаправленный ввод/вывод. Для удобства в библиотеке определены три стандартных объекта-потока:
‒ cin — объект класса istream, соответствующий стандартному вводу. В общем случае он позволяет читать данные с терминала пользователя;
‒ cout — объект класса ostream, соответствующий стандартному выводу. В общем случае он позволяет выводить данные на терминал пользователя;
‒ cerr — объект класса ostream, соответствующий стандартному выводу для ошибок. В этот поток мы направляем сообщения об ошибках программы. [2]
В статье рассмотрен вопрос применения манипуляторов в оператор cout. Начинающие первом делом работают с операторами ввода/вывода. Чтобы взять результат в консольном окне, им понадобится оператор cout. Если задача имеет отношение к системе счисления, тогда используются dec, oct, hex и setbase манипуляторы.
Манипуляторы — это объекты, определенные в заголовочном файле iomanip, которые может управлять потоками ввод-вывода (чтобы иметь возможность пользоваться манипуляторами, вы должны не забыть включить iomanip в программу). Единственное преимущество манипуляторов в том, что программа может включать их прямо в поток, не прибегая к вызову отдельной функции. [5]
Целые числа обычно интерпретируются как десятичные (по основанию 10) значения. Чтобы изменить основание системы счисления, в которой поток будет интерпретировать целые числа, используют манипулятор hex для шестнадцатеричной системы (по основанию 16) и манипулятор oct для восьмеричной (по основанию 8). Манипулятор потока dec возвращает поток к десятичной системе счисления. [1]
Основание системы счисления в потоке также можно изменить манипулятором потока setbase, у который имеется один целый аргумент, принимающий значения 10, 8 или 16 для основания системы счисления. Чтобы использовать манипуляторы, нам необходимо включить в программу заголовочный файл #include
Рассмотрим на примерах.
#include
#include
#include
using namespace std;
int main()
{
setlocale(LC_CTYPE, "rus"); // вызов функции настройки локализация консолы
int chislo;
cout<<"Выведите число: ";
cin>>chislo; //ввести число
/* Использование hex для вывода шестнадцатеричного числа*/
cout<<"Число "<
<
/* Использование oct для вывода восьмеричного числа*/
cout<
<
/* Использование setbase для вывода десятичного числа*/
cout<<"Число "<
return 0;
}
Результат работы программы на рисунке 1.
Рис. 1.
Литература:
- Х. М. Дейтел, П. Дж. Дейтел. Как программировать на С++: Пятое издание. Пер. с англ. — М.: ООО «Бином-Пресс», 2008 г. — 1456 с.: ил.
- Страуструп, Бьярне. Программирование: принципы и практика использования C++.: Пер. с англ. — М.: ООО «И. Д. Вильяме», 2011. — 1248 с.: ил.
- С. В. Глушаков, А. В. Коваль, С. В. Смирнов. Язык программирование С++. Учебный курс. Харьков «Фолио» Ростов-на-Дону «Феникс» 2001. — 490 с.
- Р. Лафоре. Объектно-ориентированное программирование в С++: 4-Е издание. Питер 2004. — 922 с.
- Дэвис, Стефан,. С++ для «чайников», 4-е издание.: Пер. с. англ.: — М.: Издательский дом «Вильямс», 2003, — 336 с.: ил.: Парал. тит. англ.