关于C++中的格式化输入输出(详解版)
标准库定义了一组操作符来改变流的格式状态,包括控制数值的输入与输出形式以及控制补白的数量和位置,大多数改变格式状态的操作符是设置/复原成对的,当操作符改变流的格式状态时,通常改变后的状态对所有后续IO都生效。
控制布尔值的格式
默认情况下bool值打印为1或0,我们可以使用boolalpha操作符使之输出true或false,使用noboolapha可以取消这种格式状态。对于输入流也同样生效,只有输入true才能使值变为true,输入1不行。
#include <iostream> #include <ios> #include <iomanip> //for setprecision using namespace std; int main() { // float number = 123.456789; // cout<<fixed<<showpoint;//use decimal form,print decimal points // cout<<"Number is"<<setprecision(3)<<number<<endl; // cout<<"Number is"<<setprecision(4)<<number<<endl; cout << true << endl; cout << false << endl; cout << boolalpha; cout << true << endl; cout << false << endl; cout << noboolalpha; cout << true << endl; cout << false << endl; bool value = true; cin >> boolalpha >> value;//只有输入true/false时,value才能从流中提取值,要是没有输入true/false,则value的值默认为false,又因为cout没有使用boolalpha,所以会输出0/1 cout << value << endl; system("pause"); return 0; }
控制浮点数格式
默认情况下,浮点数按六位数字精度打印,如果浮点数没有小数部分则不打印小数点,根据浮点数的值选择打印成定点十进制或科学记数法形式,标准库会选择一种可读性更好的格式:非常大和非常小的值打印为科学记数形式,其它值打印为定点十进制形式。
默认情况下,精度控制打印的数字的总数,浮点值按当前精度舍入而非截断,使用precision可以获取当前流的浮点数精度值以及设置流的浮点数精度值。
#include <iostream> #include <iomanip> //for setprecision using namespace std; int main(){ float number = 123.456789; cout<<fixed<<showpoint;//use decimal form,print decimal points cout<<"Number is"<<setprecision(3)<<number<<endl; cout<<"Number is"<<setprecision(4)<<number<<endl; system("pause"); return 0; }
下图为控制台输出的结果
指定整型值的进制
默认情况下,整型值的输入输出使用十进制,我们可以使用操作符hex、oct、和dec将其改为十六进制,八进制,十进制。
#include <iostream> using namespace std; int main() { cout << hex << 111 << endl;//6f cout << oct << 111 << endl;//157 cout << dec << 111 << endl;//111 system("pause"); }
输入十六进制后输出十进制。
int main() { int value = 100; cin >> hex >> value; cout << dec << value << endl; system("pause"); }
使用showbase可以显示进制,uppercase可以控制十六进制的x是否大写。
int main() { cout <<uppercase<< showbase;//在输出结果中显式进制,0x表示十六进制,0表示八进制 cout << hex << 111 << endl;//0X6f cout << nouppercase; cout << hex << 111 << endl;//0x6f cout << oct << 111 << endl;//0157 cout << dec << 111 << endl;//111 cout << noshowbase; cout << hex << 111 << endl;//6f cout << oct << 111 << endl;//157 cout << dec << 111 << endl;//111 system("pause"); }
控制输入格式
默认情况下,输入运算符会忽略空白符(空格符,制表符,换行符,换纸符和回车符),使用noskipws会令输入运算符读取空白符,而不是跳过他们。
int main(){ char c; cin >> noskipws; while(cin >> c){ cout << c; } }
输出空白
setw可以指定下一个输出的最小空间,如果不满则用空格填充,类似endl,setw不改变输出流的内部状态,它只决定下一个输出的大小。
setw默认使用右对齐格式,使用left和right可以修改对齐格式为左对齐和右对齐,使用internal修改对齐格式为符号左对齐,值右对齐。使用setfill可允许指定一个字符代替默认的空格来补白输出。
int main() { cout <<setw(16)<< -3.14156789 << endl; cout <<left<< setw(16) << -3.14156789 << endl; cout << right << setw(16) << -3.14156789 << endl; cout << internal << setw(16) << -3.14156789 << endl; cout << setfill('*') << endl; cout << left << setw(16) << -3.14156789 << endl; cout << right << setw(16) << -3.14156789 << endl; cout << internal << setw(16) << -3.14156789 << endl; system("pause"); }
-3.14157 -3.14157 -3.14157 - 3.14157 -3.14157******** ********-3.14157 -********3.14157
提供两张表,来查看c++输入输出的格式操作符。