Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CPlusPlusNotesForProfessionals.pdf
Скачиваний:
47
Добавлен:
20.05.2023
Размер:
5.11 Mб
Скачать

Chapter 14: Stream manipulators

Manipulators are special helper functions that help controlling input and output streams using operator >> or operator <<.

They all can be included by #include <iomanip>.

Section 14.1: Stream manipulators

std::boolalpha and std::noboolalpha - switch between textual and numeric representation of booleans.

std::cout << std::boolalpha << 1; // Output: true

std::cout << std::noboolalpha << false; // Output: 0

bool boolValue;

std::cin >> std::boolalpha >> boolValue;

std::cout << "Value \"" << std::boolalpha << boolValue

<<"\" was parsed as " << std::noboolalpha << boolValue;

//Input: true

//Output: Value "true" was parsed as 0

std::showbase and std::noshowbase - control whether prefix indicating numeric base is used.

std::dec (decimal), std::hex (hexadecimal) and std::oct (octal) - are used for changing base for integers.

#include <sstream>

std::cout << std::dec << 29 << ' - '

<<std::hex << 29 << ' - '

<<std::showbase << std::oct << 29 << ' - '

<<std::noshowbase << 29 '\n';

int number;

std::istringstream("3B") >> std::hex >> number; std::cout << std::dec << 10;

//Output: 22 - 1D - 35 - 035

//59

Default values are std::ios_base::noshowbase and std::ios_base::dec.

If you want to see more about std::istringstream check out the <sstream> header.

std::uppercase and std::nouppercase - control whether uppercase characters are used in floating-point and hexadecimal integer output. Have no e ect on input streams.

std::cout << std::hex << std::showbase

<<"0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n'

<<"1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n'

}

//Output: 0x2a with nouppercase: 0x2a

//1e-10 with uppercase: 1E-10

GoalKicker.com – C++ Notes for Professionals

68

Default is std::nouppercase.

std::setw(n) - changes the width of the next input/output field to exactly n.

The width property n is resetting to 0 when some functions are called (full list is here).

std::cout << "no setw:" << 51 << '\n'

<<"setw(7): " << std::setw(7) << 51 << '\n'

<<"setw(7), more output: " << 13

<<std::setw(7) << std::setfill('*') << 67 << ' ' << 94 << '\n';

char* input = "Hello, world!"; char arr[10];

std::cin >> std::setw(6) >> arr;

std::cout << "Input from \"Hello, world!\" with setw(6) gave \"" << arr << "\"\n";

//Output: 51

//setw(7): 51

//setw(7), more output: 13*****67 94

//Input: Hello, world!

//Output: Input from "Hello, world!" with setw(6) gave "Hello"

Default is std::setw(0).

std::left, std::right and std::internal - modify the default position of the fill characters by setting

std::ios_base::adjustfield to std::ios_base::left, std::ios_base::right and std::ios_base::internal

correspondingly. std::left and std::right apply to any output, std::internal - for integer, floating-point and

monetary output. Have no e ect on input streams.

#include <locale>

...

std::cout.imbue(std::locale("en_US.utf8"));

std::cout << std::left << std::showbase << std::setfill('*')

<<"flt: " << std::setw(15) << -9.87 << '\n'

<<"hex: " << std::setw(15) << 41 << '\n'

<<" $: " << std::setw(15) << std::put_money(367, false) << '\n'

<<"usd: " << std::setw(15) << std::put_money(367, true) << '\n'

<<"usd: " << std::setw(15)

<<std::setfill(' ') << std::put_money(367, false) << '\n';

//Output:

//flt: -9.87**********

//hex: 41*************

//$: $3.67**********

//usd: USD *3.67******

//usd: $3.67

std::cout << std::internal << std::showbase << std::setfill('*')

<<"flt: " << std::setw(15) << -9.87 << '\n'

<<"hex: " << std::setw(15) << 41 << '\n'

<<" $: " << std::setw(15) << std::put_money(367, false) << '\n'

<<"usd: " << std::setw(15) << std::put_money(367, true) << '\n'

<<"usd: " << std::setw(15)

<<std::setfill(' ') << std::put_money(367, true) << '\n';

GoalKicker.com – C++ Notes for Professionals

69

//Output:

//flt: -**********9.87

//hex: *************41

//$: $3.67**********

//usd: USD *******3.67

// usd: USD

3.67

std::cout << std::right << std::showbase << std::setfill('*')

<<"flt: " << std::setw(15) << -9.87 << '\n'

<<"hex: " << std::setw(15) << 41 << '\n'

<<" $: " << std::setw(15) << std::put_money(367, false) << '\n'

<<"usd: " << std::setw(15) << std::put_money(367, true) << '\n'

<<"usd: " << std::setw(15)

<<std::setfill(' ') << std::put_money(367, true) << '\n';

//Output:

//flt: **********-9.87

//hex: *************41

//$: **********$3.67

//usd: ******USD *3.67

//usd: USD 3.67

Default is std::left.

std::fixed, std::scientific, std::hexfloat [C++11] and std::defaultfloat [C++11] - change formatting for

floating-point input/output.

std::fixed sets the std::ios_base::floatfield to std::ios_base::fixed,

std::scientific - to std::ios_base::scientific,

std::hexfloat - to std::ios_base::fixed | std::ios_base::scientific and

std::defaultfloat - to std::ios_base::fmtflags(0).

fmtflags

#include <sstream>

...

std::cout <<

'\n'

 

 

 

 

<<

"The number 0.07 in

fixed:

" << std::fixed << 0.01 << '\n'

<<

"The number 0.07

in

scientific:

" << std::scientific << 0.01 << '\n'

<<

"The number 0.07

in

hexfloat:

" <<

std::hexfloat << 0.01 << '\n'

<<

"The number 0.07

in

default:

" <<

std::defaultfloat << 0.01 << '\n';

double f;

std::istringstream is("0x1P-1022");

double f = std::strtod(is.str().c_str(), NULL);

std::cout << "Parsing 0x1P-1022 as hex gives " << f << '\n';

//

Output:

 

//

The number 0.01 in fixed:

0.070000

//The number 0.01 in scientific: 7.000000e-02

//The number 0.01 in hexfloat: 0x1.1eb851eb851ecp-4

//The number 0.01 in default: 0.07

//Parsing 0x1P-1022 as hex gives 2.22507e-308

Default is std::ios_base::fmtflags(0).

There is a bug on some compilers which causes

GoalKicker.com – C++ Notes for Professionals

70

double f;

std::istringstream("0x1P-1022") >> std::hexfloat >> f; std::cout << "Parsing 0x1P-1022 as hex gives " << f << '\n'; // Output: Parsing 0x1P-1022 as hex gives 0

std::showpoint and std::noshowpoint - control whether decimal point is always included in floating-point representation. Have no e ect on input streams.

std::cout << "7.0 with showpoint: " << std::showpoint << 7.0 << '\n'

<<"7.0 with noshowpoint: " << std::noshowpoint << 7.0 << '\n';

//Output: 1.0 with showpoint: 7.00000

//1.0 with noshowpoint: 7

Default is std::showpoint.

std::showpos and std::noshowpos - control displaying of the + sign in non-negative output. Have no e ect on input streams.

std::cout << "With showpos: " << std::showpos

<<0 << ' ' << -2.718 << ' ' << 17 << '\n'

<<"Without showpos: " << std::noshowpos

<<0 << ' ' << -2.718 << ' ' << 17 << '\n';

//Output: With showpos: +0 -2.718 +17

//Without showpos: 0 -2.718 17

Default if std::noshowpos.

std::unitbuf, std::nounitbuf - control flushing output stream after every operation. Have no e ect on input stream. std::unitbuf causes flushing.

std::setbase(base) - sets the numeric base of the stream.

std::setbase(8) equals to setting std::ios_base::basefield to std::ios_base::oct, std::setbase(16) - to std::ios_base::hex,

std::setbase(10) - to std::ios_base::dec.

If base is other then 8, 10 or 16 then std::ios_base::basefield is setting to std::ios_base::fmtflags(0). It means decimal output and prefix-dependent input.

As default std::ios_base::basefield is std::ios_base::dec then by default std::setbase(10).

std::setprecision(n) - changes floating-point precision.

#include <cmath> #include <limits>

...

typedef std::numeric_limits<long double> ld;

GoalKicker.com – C++ Notes for Professionals

71

const long double pi = std::acos(-1.L);

 

 

std::cout <<

'\n'

 

 

 

<<

"default precision (6):

pi: "

<< pi << '\n'

 

<<

"

10pi: "

<< 10 * pi <<

'\n'

<<"std::setprecision(4): 10pi: " << std::setprecision(4) << 10 * pi << '\n'

<<" 10000pi: " << 10000 * pi << '\n'

<< "std::fixed:

10000pi: " << std::fixed << 10000 * pi << std::defaultfloat <<

'\n'

<<"std::setprecision(10): pi: " << std::setprecision(10) << pi << '\n'

<<"max-1 radix precicion: pi: " << std::setprecision(ld::digits - 1) << pi << '\n'

<<"max+1 radix precision: pi: " << std::setprecision(ld::digits + 1) << pi << '\n'

<<"significant digits prec: pi: " << std::setprecision(ld::digits10) << pi << '\n';

//Output:

//default precision (6): pi: 3.14159

//

10pi:

31.4159

// std::setprecision(4): 10pi:

31.42

//

10000pi:

3.142e+04

// std::fixed:

10000pi:

31415.9265

//std::setprecision(10): pi: 3.141592654

//max-1 radix precicion: pi: 3.14159265358979323851280895940618620443274267017841339111328125

//max+1 radix precision: pi: 3.14159265358979323851280895940618620443274267017841339111328125

//significant digits prec: pi: 3.14159265358979324

Default is std::setprecision(6).

std::setiosflags(mask) and std::resetiosflags(mask) - set and clear flags specified in mask of

std::ios_base::fmtflags type.

#include <sstream>

...

std::istringstream in("10 010 10

010 10 010");

 

 

int num1, num2;

 

 

 

in >> std::oct >> num1 >> num2;

 

 

 

std::cout << "Parsing \"10 010\"

with std::oct gives:

" << num1 << ' ' << num2 << '\n';

// Output: Parsing "10 010" with

std::oct gives:

8 8

in >> std::dec >> num1 >> num2;

 

 

 

std::cout << "Parsing \"10 010\"

with std::dec gives:

" << num1 << ' ' << num2 << '\n';

// Output: Parsing "10 010" with

std::oct gives:

10

10

in >> std::resetiosflags(std::ios_base::basefield) >> num1 >> num2;

std::cout << "Parsing \"10 010\" with autodetect gives: " << num1 << ' ' << num2 << '\n'; // Parsing "10 010" with autodetect gives: 10 8

std::cout << std::setiosflags(std::ios_base::hex | std::ios_base::uppercase | std::ios_base::showbase) << 42 << '\n';

// Output: OX2A

std::skipws and std::noskipws - control skipping of leading whitespace by the formatted input functions. Have no

e ect on output streams.

#include <sstream>

GoalKicker.com – C++ Notes for Professionals

72