Опубликован: 10.10.2006 | Уровень: специалист | Доступ: платный
Лекция 10:

Потоки

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

Стандартные манипуляторы, приведенные в \S 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

Заметьте, что происходит округление, а не отбрасывание дробной части.

Стандартные манипуляторы, введенные в \S 10.4.2.1, предлагают более элегантный способ задания формата вывода вещественных.

Равиль Ярупов
Равиль Ярупов
Федор Антонов
Федор Антонов

Здравствуйте!

Записался на ваш курс, но не понимаю как произвести оплату.

Надо ли писать заявление и, если да, то куда отправлять?

как я получу диплом о профессиональной переподготовке?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989