在C++中有一些十分有用的预设格式,可以方便我们在进行流输出时输出想要的格式,而不再需要printf或sprintf来进行格式化输出,更“C++”化。
头文件:<iostream>
函数1:ios_base& boolalpha(ios_base& str)
作用:把bool值用“ture”或"false"字符串输出
函数2:ios_base& noboolalpha(ios_base& str)
作用:把bool值不用字符串输出(即用整数输出)
示例1:bool c = false;
bool d = true;
cout << boolalpha << c << endl << noboolalpha << d << endl;
输出:false [换行] 1
示例2:bool c = false;
bool d = true;
stringstream ss;
ss << boolalpha << c << endl << noboolalpha << d << endl;
cout << ss.str();
输出:同上
函数3:dec
函数4:hex
函数5:oct
作用:分别按10进制、16进制、8进制输出
示例:int e = 123;
cout << dec << e << "-" << hex << e << "-" << oct << e << endl;
输出:123-7b-173
函数6:fixed 输出浮点数,小数点后保留5位,不足补0
函数7:scientific 科学计数法表示浮点数,小数点后保留5位,不足补0
函数8:hexfloat 按16进制输出小数
函数9:defaultfloat 默认小数输出格式,不设置格式标志时,默认使用该格式
函数10:internal
函数11:left
函数12:right
作用:在输出空间中,字符对齐方式:两端对齐,左端对齐,右端对齐
示例:左端对齐右端对齐比较好理解,主要是internal,在带符号数字输出时,符号在左端,字符在右端
int n = -77;
std::cout << "12345678" << endl;
std::cout.width(8); std::cout << std::internal << n << '\n';
std::cout.width(8); std::cout << std::left << n << '\n';
std::cout.width(8); std::cout << std::right << n << '\n';
输出:12345678
- 77
-77
-77
如果是字符串,则internal也是右端对齐
char* n = "a b c";
std::cout << "12345678" << endl;
std::cout.width(8); std::cout << std::internal << n << '\n';
std::cout.width(8); std::cout << std::left << n << '\n';
std::cout.width(8); std::cout << std::right << n << '\n';
输出:|12345678|
| a b c|
| a b c |
| a b c |
函数13:showbase
函数14:noshowbase
作用:是否显示数制符号,16进制显示0x,8进制显示0
示例:int n = 20;
std::cout << std::dec << std::showbase << n << '\n';
std::cout << std::dec << std::noshowbase << n << '\n';
std::cout << std::hex << std::showbase << n << '\n';
std::cout << std::hex << std::noshowbase << n << '\n';
std::cout << std::oct << std::showbase << n << '\n';
std::cout << std::oct << std::noshowbase << n << '\n';
输出:20 20 0x14 14 024 24
函数15:showpoint
函数16:noshowpoint
作用:是否显示小数点
函数17:showpos
函数18:noshowpos
作用:是否显示正数的符号 “+”
函数19:skipws
函数20:noskipws
作用:只能作用于输入流,输入时是否跳过空白符,如果是,则输入第一个不是空白符的字符,然后输入下一个不是空白符的字符,如果否,则每位空白符也被当做输入字符。
空白符包括制表符(Tab),回车,空格(blank space)
示例:char *n = " 1 2 3 ";
char a, b, c;
stringstream ss(n);
cout << ss.str() << endl;
ss >> skipws >> a >> b >> c;
cout << a << b << c <<endl;
ss.seekg(0);
ss >> noskipws >> a >> b >> c;
cout << a << b << c << endl;
输出:| 1 2 3 |
|123|
| 1 |
函数21:uppercase
函数22:nouppsercase
作用:英文字符大写或者小写
示例:std::cout << std::showbase << std::hex; std::cout << std::uppercase << 777777 << '\n'; std::cout << std::nouppercase << 777777 << '\n';
输出:|0XBDE31|
|0xbde31|
有了这些格式,C++也可以输出接近于Java那么丰富的字符串了。结合stringstream,可以在内存中改变字符串的格式,比如全部大写或者全部小写,或者在数字前加上符号、进制。