cout的I/O流的数据格式编排
cout<<setiosflags(ios::fixed) <<setiosflags(ios::showpoint) <<setprecision(2) <<setw(10) <<salemon;
这里主要牵扯到ios类,这里我们关心这两个ios标记:fixed和showpoint。
设置标记,可以使用 以标记的名称为参数的 操作程序setiosflags。其中在括号中,标记名称必须跟在类名之后,并且之间要有字段分解运算符(::);
fixed:保证数字以定点形式存在,而不会以指数的格式显示。
showpoint:保证小数点的存在,即使那个数字并没有小数部分。
setprecision():用数字作为参数,表示数字精确度(即小数点的位数)。
setw():用数字作为参数,设置字段的宽度,并且文字靠右对齐。
这里:cout<<setiosflags(ios::fixed) 可以写成 cout.setf(ios::fixed)
cout<<setiosflags(ios::showpoint) 可以写成 cout.setf(ios::showpoint)
out<<setprecision(2) 可以写成 cout.precision(2)
以下是一些常见的控制函数的:
dec 置基数为10 相当于"%d"
hex 置基数为16 相当于"%X"
oct 置基数为8 相当于"%o"
setfill(c) 设填充字符为c
setprecision(n) 设显示小数精度为n位
setw(n) 设域宽为n个字符
这个控制符的意思是保证输出宽度为n。如:
cout<<setw(3)<<1<<setw(3)<<10<<setw(3)<<100; 输出结果为
1 10100 (默认是右对齐)当输出长度大于3时(<<1000),setw(3)不起作用。
setioflags(ios::fixed) 固定的浮点显示
setioflags(ios::scientific) 指数表示
setiosflags(ios::left) 左对齐
setiosflags(ios::right) 右对齐
setiosflags(ios::skipws 忽略前导空白
setiosflags(ios::uppercase) 16进制数大写输出
setiosflags(ios::lowercase) 16进制小写输出
setiosflags(ios::showpoint) 强制显示小数点
setiosflags(ios::showpos) 强制显示符号
这里有个例子:
#include <iostream> #include <iomanip> using namespace std; int main() { cout<<12345.0<<endl;//输出"12345" cout<<setiosflags(ios::fixed)<<setiosflags(ios::showpoint)<<setprecision(3)<<1.2345<<endl;//输出"1.235" cout<<setiosflags(ios::scientific)<<12345.0<<endl;//输出"1.234500e+004 " cout<<setprecision(3)<<12345.0<<endl;//输出"1.235e+004 " return 0; }
这是网上的例子,按照规则,标记后应该是正确答案,可是我用vs2008测试这个程序的时候却出现的错误的结果:
但是用别的编译器,虽然结果不完全是这样,但是好歹不出现乱码!
vs2005和vc 6.0 运行结果:
不知道是不是编译器出现问题了,问题待解决,也希望看到文章的人帮忙解释下问题的本质,谢谢。