c++要进行格式化输入与输出,应该怎么设置?------iampsl@qq.com
要弄清这个问题,我们应该先来了解一下C++的格式化输入与输出。
在基类basic_ios中有四个成员变量是用来控制格式化的,状态标志字,域宽,填充字符,输出精度。也就是说C++中一个流在进行输入与输出时,它会去查询这四个成员变量,接着它就会按这四个成员变量设置的方式进行输入与输出。这就是C++格式化输入与输出的过程。知道这个过程了,就很快知道应该怎样去控制流的输入与输出格式了,就是设置这四个成员变量即可,但成员变量都是私有的,我们应该怎么去更改它们的值呢,这肯定是用流类的成员函数,如std::cout.setfill('*');用它们对应的成员函数好是好,但总是要把这个设置操作单独放一行,使用起来不怎么好,这个问题应该怎么解决呢,cout<<endl;这个操作是什么意思呢,首先我们必需要了解的是,endl是一个函数的名称,那么cout<<endl;把一个函数指针传给一个重载函数。显然我们可以猜想这个重载函数进行的操作应该如下:
ostream & ostream::operator<<(ostream & (*endl)(ostream & out))
{
return endl(*this);
}
而函数endl(ostream & out)应该是如下:
ostream & endl(ostream & out)
{
out.插入一个'/n';
out.刷新流;
return out;
}
那像cout<<123<<setw(10)<<endl;又是怎么做到的呢,这个其实也是很简单的,setw(10)是一个函数,它会返回一个临时对象,这个对象可以是类对象,也可以是结构体对象,很显然流类对象还需要重载这个带这种对象参数的函数。
那这个代码又应该怎么写呢。
代码可能如下:
class width
{
public:
width(int w)
{ m_w=w;}
int m_w;
}
width setw(int w)
{
return width(w);
}
ostream & ostream::operator<<(width & w)
{
this->宽域=w.m_w;
return *this;
}
大体就是这样的,从上面可以看出如果我们要制作自己的操纵符只能是那种接受函数指针的,而不能是那种接受带对象的,因为带函数指针的流类对象已经重载了,而带对象的只重载类库自己定义的,而你定义的肯定是没有重载的。
噢,对了流类对象中都有一个成员变量来标识类对象的状态,当流对象的状态出错了,你应该用clear()把它设为正确状态,不然的话,流对象可就罢工了,什么都不干。上述叙述不能保证是对的,因为那都是本人的猜测而己,如果你知道正确的,那要记得告诉我哦,.邮件:iampsl@qq.com