详解C++ cout格式化输出完全攻略
部分内容来自教程C语言中文网一个很棒的网站有时希望按照一定的格式进行输出如按十六进制输出整数输出浮点数时保留小数点后面两位输出整数时按 6 个数字的宽度输出宽度不足时左边补 0等等。C语言中的 printf() 函数使用以%开头的格式控制符例如 %X、%.2f、%6d 等C 中的 cout 对象则使用流操作算子你也可以叫做格式控制符或者成员函数进行控制。使用流操作算子C 中常用的输出流操纵算子如表 1 所示它们都是在头文件 iomanip 中定义的要使用这些流操纵算子必须包含该头文件。注意“流操纵算子”一栏中的星号*不是算子的一部分星号表示在没有使用任何算子的情况下就等效于使用了该算子。例如在默认情况下整数是用十进制形式输出的等效于使用了 dec 算子。流操纵算子作 用*dec以十进制形式输出整数常用hex以十六进制形式输出整数|oct以八进制形式输出整数|fixed以普通小数形式输出浮点数|scientific以科学计数法形式输出浮点数|left左对齐即在宽度不足时将填充字符添加到右边|*right右对齐即在宽度不足时将填充字符添加到左边|setbase(b)设置输出整数时的进制b8、10 或 16|setw(w)指定输出宽度为 w 个字符或输人字符串时读入 w 个字符|setfill(c)在指定输出宽度的情况下输出的宽度不足时用字符 c 填充默认情况是用空格填充|setprecision(n)设置输出浮点数的精度为 n。 在使用非 fixed 且非 scientific 方式输出的情况下n 即为有效数字最多的位数如果有效数字位数超过 n则小数部分四舍五人或自动变为科学计 数法输出并保留一共 n 位有效数字。 在使用 fixed 方式和 scientific 方式输出的情况下n 是小数点后面应保留的位数。|setiosflags(flag)将某个输出格式标志置为 1|resetiosflags(flag)将某个输出格式标志置为 0|boolapha把 true 和 false 输出为字符串不常用*noboolalpha把 true 和 false 输出为 0、1-showbase输出表示数值的进制的前缀-*noshowbase不输出表示数值的进制.的前缀-showpoint总是输出小数点-*noshowpoint只有当小数部分存在时才显示小数点-showpos在非负数值中显示 -*noshowpos在非负数值中不显示 -*skipws输入时跳过空白字符-noskipws输入时不跳过空白字符-uppercase十六进制数中使用 A~E。若输出前缀则前缀输出 0X科学计数法中输出 E-*nouppercase十六进制数中使用 a~e。若输出前缀则前缀输出 0x科学计数法中输出 e。-internal数值的符号正负号在指定宽度内左对齐数值右对 齐中间由填充字符填充。|代表常用-代表不常用流操作算子的使用方法使用这些算子的方法是将算子用 和 cout 连用。例如1cout hex 12 , 24;这条语句的作用是指定以十六进制形式输出后面两个数因此输出结果是c, 18setiosflags() 算子setiosflags() 算子实际上是一个库函数它以一些标志作为参数这些标志可以是在 iostream 头文件中定义的以下几种取值它们的含义和同名算子一样。标 志作 用ios::left输出数据在本域宽范围内向左对齐ios::right输出数据在本域宽范围内向右对齐ios::internal数值的符号位在域宽内左对齐数值右对齐中间由填充字符填充ios::dec设置整数的基数为 10ios::oct设置整数的基数为 8ios::hex设置整数的基数为 16ios::showbase强制输出整数的基数八进制数以 0 开头十六进制数以 0x 打头ios::showpoint强制输出浮点数的小点和尾数 0ios::uppercase在以科学记数法格式 E 和以十六进制输出字母时以大写表示ios::showpos对正数显示“”号ios::scientific浮点数以科学记数法格式输出ios::fixed浮点数以定点格式小数形式输出ios::unitbuf每次输出之后刷新所有的流ios::stdio每次输出之后清除 stdout, stderr这些标志实际上都是仅有某比特位为 1而其他比特位都为 0 的整数。多个标志可以用|运算符连接表示同时设置。例如1cout setiosflags(ios::scientific|ios::showpos) 12.34;输出结果是1.234000e001如果两个相互矛盾的标志同时被设置如先设置 setiosflags(ios::fixed)然后又设置 setiosflags(ios::scientific)那么结果可能就是两个标志都不起作用。因此在设置了某标志又要设置其他与之矛盾的标志时就应该用 resetiosflags 清除原先的标志。例如下面三条语句123cout setiosflags(ios::fixed) 12.34 endl;cout resetiosflags(ios::fixed) setiosflags(ios::scientific | ios::showpos) 12.34 endl;cout resetiosflags(ios::showpos) 12.34 endl;//清除要输出正号的标志输出结果是12.3400001.234000e0011.234000e001综合示例关于流操纵算子的使用来看下面的程序。1234567891011121314151617181920212223242526#include iomanip#include iostreamusingnamespacestd;intmain() {intn 141;// 1) 分别以十六进制、十进制、八进制先后输出 ncout 1) hex n dec n oct n endl;doublex 1234567.89, y 12.34567;// 2)保留5位有效数字cout 2) setprecision(5) x y endl;// 3)保留小数点后面5位cout 3) fixed setprecision(5) x y endl;// 4)科学计数法输出且保留小数点后面5位cout 4) scientific setprecision(5) x y endl;// 5)非负数显示正号输出宽度为12字符宽度不足则用 * 填补cout 5) showpos fixed setw(12) setfill(*) 12.1 endl;// 6)非负数不显示正号输出宽度为12字符宽度不足则右边用填充字符填充cout 6) noshowpos setw(12) left 12.1 endl;// 7)输出宽度为 12 字符宽度不足则左边用填充字符填充cout 7) setw(12) right 12.1 endl;// 8)宽度不足时负号和数值分列左右中间用填充字符填充cout 8) setw(12) internal -12.1 endl;cout 9) 12.1 endl;return0;}程序的输出结果是1)8d 141 2152)1.2346e06 12.3463)1234567.89000 12.345674)1.23457e06 1.23457e015)***12.100006)12.10000****7)****12.100008)-***12.100009)12.10000需要注意的是setw() 算子所起的作用是一次性的即只影响下一次输出。每次需要指定输出宽度时都要使用 setw()。因此可以看到第 9) 行的输出因为没有使用 setw()输出的宽度就不再是前面指定的 12 个字符。在读入字符串时setw() 还能影响 cin 的行为。例如下面的程序123456789#include iomanip#include iostreamusingnamespacestd;intmain() {string s1, s2;cin setw(4) s1 setw(3) s2;cout s1 , s2 endl;return0;}输入1234567890↙程序的输出结果是1234,567说明setw(4)使得读入 s1 时只读入 4 个字符其后的setw(3)使得读入 s2 时只读入 3 个字符。setw() 用于 cin 时同样只影响下一次的输入。思考题setw() 究竟是如何实现的以至于能和 cout 连用来指定输出宽度自行查看编译器所带的 iomanip 头文件然后写一个功能和 setw() 完全相同的 mysetw()。调用cout的成员函数ostream 类有一些成员函数通过 cout 调用它们也能用于控制输出的格式其作用和流操纵算子相同如表 3 所示。成员函数作用相同的流操纵算子说明precision(n)setprecision(n)设置输出浮点数的精度为 n。width(w)setw(w)指定输出宽度为 w 个字符。fill(c)setfill (c)在指定输出宽度的情况下输出的宽度不足时用字符 c 填充默认情况是用空格填充。setf(flag)setiosflags(flag)将某个输出格式标志置为 1。unsetf(flag)resetiosflags(flag)将某个输出格式标志置为 0。setf 和 unsetf 函数用到的flag与setiosflags 和 resetiosflags 用到的完全相同。这些成员函数的用法十分简单。例如下面的三行程序1cout.setf(ios::scientific);cout.precision(8);cout 12.23 endl;输出结果是1.22300000e001到此这篇关于详解C cout格式化输出完全攻略的文章就介绍到这了