В 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 для вывода десятичного числа*/
return 0;
}
Результат работы программы на рисунке 1.
Рис. 1.
Литература: