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测试这个程序的时候却出现的错误的结果

QQ截图未命名

但是用别的编译器,虽然结果不完全是这样,但是好歹不出现乱码!

vs2005和vc 6.0 运行结果:

未命名

不知道是不是编译器出现问题了,问题待解决,也希望看到文章的人帮忙解释下问题的本质,谢谢。

 
posted @ 2011-08-11 16:49  csqlwy  阅读(2062)  评论(1编辑  收藏  举报