注册 登录
编程论坛 C++教室

关于;格式输出控制符的疑惑

tianxiao110 发布于 2010-08-02 16:21, 976 次点击
刚开始学C++ ,前辈们别见笑哦!  呵呵。
疑惑是:
有的格式控制符输出一次,以后的数据输出格式就这样定了;
有的格式控制符输出一次,但他却只对后面的第一次输出有效;
我就困惑在那些控制符属于第一种,那些属于第二种啊??
我举个例子说明一下:
#include<iostream>
#include<iomanip>   
using namespace std;
int main()
{
    char *p="tianxiao";
    cout<<setw(10);    //这个控制符只对后面的第一次输出有效
    cout<<p<<endl;
    cout<<p<<endl;
    double a=3.1415926;
    cout<<"a="<<setprecision(4)<<a<<endl;   // 这个控制符却对后面的所有输出都有效。
    cout<<a<<endl;
    system("pause");
}
8 回复
#2
东海一鱼2010-08-02 18:45
这个基本没用过,听听楼下高手的高论。呵呵。
#3
pangding2010-08-03 03:39
还真是没太注意过这个,学的时候感觉这么设计挺合理的就记住了。效果是知道但为什么会这样呢?

后来学的多了,知道流的状态很多是靠标记实现的。刚才为了弄清楚你的这个问题,还特意查了一下标准,其中格式标记的类型是:
ios_base::fmtflags
它定义的记录信息有以下这些:
     *  - boolalpha
     *  - dec
     *  - fixed
     *  - hex
     *  - internal
     *  - left
     *  - oct
     *  - right
     *  - scientific
     *  - showbase
     *  - showpoint
     *  - showpos
     *  - skipws
     *  - unitbuf
     *  - uppercase
     *  - adjustfield
     *  - basefield
     *  - floatfield
正好没有你问的那两个。

仔细再看,你问的那两个分别记录在了另一个类型为 streamsize 的东东里了。而且这个类型还不定义在是 ios_bose 这个空间里的。
并且这两个虽然类型一样,但不是记录在同一个成员里的(而上面说到的 fmtflags 是在一个变量里记录所有的信息)。流类自己也只能通过 precision() 和 width() 这两个函数来操作。(<iomanip>里定义的 setprecision, setw 是这两个函数的包装。)
标准在 IO 这章里(至少是27章的第4节里,好像)根本没提这两个函数怎么影响流的输出。只是说“无参数调用它们返回的是现在的值。带参数调用,是将流的相关数据设置成新值,返回的是原来的值。“

可以肯定的是这两个函数的值是在插入的时候才影响的。感觉从实现的角度看,都是一直影响到底好像有比较好的一致性。但看来是宽度一值影响到底太不实用了,才特殊化了。

呵呵,搞了半天也没彻底弄明白你问的问题,又一次使我感觉到了 C++ 的博大精深。不过倒是在找资料的时候学了一大堆别的东西,比如说更深地领悟了一些操作符重载的技巧。和一些类型定义的使用方法和技巧~~
#4
东海一鱼2010-08-03 12:02
嗯嗯,学习了。补上个知识点的说,赚了!!!
#5
tianxiao1102010-08-03 21:43
回复 3楼 pangding
谢谢
#6
ToBeOOP2010-08-07 17:53
看了此贴,感觉受益匪浅啊。。。
#7
伟伟1102010-08-10 19:49
谢谢,学到了很多
#8
xiao920102010-08-10 22:41
怎么我学的不像这么复杂哦,,我也开始学啊,,,
我们的开始的库文件是这个
#include"stdio.h"
main()
{

}
 我们的是这样子的。。。
#9
vfdff2010-08-11 00:19
回复 3楼 pangding
您在哪里查标准呢?感觉您的学习方法值得我学习,总是从权威的标准找答案!
1