Потоки
10.4.1.4 Вывод целых
Прием задания нового значения множества флагов с помощью операции | и функций flags() и setf() работает только тогда, когда один бит определяет значение флага. Не такая ситуация при задании системы счисления целых или вида выдачи вещественных. Здесь значение, определяющее вид выдачи, нельзя задать одним битом или комбинацией отдельных битов.
Решение, принятое в <iostream.h>, сводится к использованию версии функции setf(), работающей со вторым "псевдопараметром", который показывает какой именно флаг мы хотим добавить к новому значению.
Поэтому обращения
cout.setf(ios::oct,ios::basefield); // восьмеричное cout.setf(ios::dec,ios::basefield); // десятичное cout.setf(ios::hex,ios::basefield); // шестнадцатеричное
установят систему счисления, не затрагивая других компонентов состояния потока. Если система счисления установлена, она используется до явной переустановки, поэтому
cout << 1234 << ' '; // десятичное по умолчанию cout << 1234 << ' '; cout.setf(ios::oct,ios::basefield); // восьмеричное cout << 1234 << ' '; cout << 1234 << ' '; cout.setf(ios::hex,ios::basefield); // шестнадцатеричное cout << 1234 << ' '; cout << 1234 << ' ';
напечатает
1234 1234 2322 2322 4d2 4d2
Если появится необходимость указывать систему счисления для каждого выдаваемого числа, следует установить флаг showbase. Поэтому, добавив перед приведенными выше обращениями
cout.setf(ios::showbase);
мы получим
1234 1234 02322 02322 0x4d2 0x4d2
Стандартные манипуляторы, приведенные в 10.4.2.1, предлагают более элегантный способ определения системы счисления при выводе целых.
10.4.1.5 Выравнивание полей
С помощью обращений к setf() можно управлять расположением символов в пределах поля:
cout.setf(ios::left,ios::adjustfield); // влево cout.setf(ios::right,ios::adjustfield); // вправо cout.setf(ios::internal,ios::adjustfield); // внутреннее
Будет установлено выравнивание в поле вывода, определяемом функцией ios::width(), причем не затрагивая других компонентов состояния потока.
Выравнивание можно задать следующим образом:
cout.width(4); cout << '(' << -12 << ")\n"; cout.width(4); cout.setf(ios::left,ios::adjustfield); cout << '(' << -12 << ")\n"; cout.width(4); cout.setf(ios::internal,ios::adjustfield); cout << '(' << -12) << "\n";
что выдаст
(-12) ( -12 ) (-12)
Если установлен флаг выравнивания internal (внутренний), то символы добавляются между знаком и величиной. Как видно, стандартным является выравнивание вправо.
10.4.1.6 Вывод плавающих чисел.
Вывод вещественных величин также управляется с помощью функций, работающих с состоянием потока. В частности, обращения:
cout.setf(ios::scientific,ios::floatfield); cout.setf(ios::fixed,ios::floatfield); cout.setf(0,ios::floatfield); // вернуться к стандартному
установят вид печати вещественных чисел без изменения других компонентов состояния потока.
Например:
cout << 1234.56789 << '\n'; cout.setf(ios::scientific,ios::floatfield); cout << 1234.56789 << '\n'; cout.setf(ios::fixed,ios::floatfield); cout << 1234.56789 << '\n';
напечатает
1234.57 1.234568e+03 1234.567890
После точки печатается n цифр, как задается в обращении
cout.precision(n)
По умолчанию n равно 6. Вызов функции precision влияет на все операции ввода-вывода с вещественными до следующего обращения к precision, поэтому
cout.precision(8); cout << 1234.56789 << '\n'; cout << 1234.56789 << '\n'; cout.precision(4); cout << 1234.56789 << '\n'; cout << 1234.56789 << '\n';
выдаст
1234.5679 1234.5679 1235 1235
Заметьте, что происходит округление, а не отбрасывание дробной части.
Стандартные манипуляторы, введенные в 10.4.2.1, предлагают более элегантный способ задания формата вывода вещественных.