explicit basic_ostream(basic_streambuf<_Elem, _Traits> *_Strbuf,bool _Isstd = false)
basic_ostream(_Uninitialized, bool _Addit = true)
可是当时的我还不能看懂这个声明的意思,于是我就想着去看看cout的定义,于是我就点击cout-转到定义,得到的是__PURE_APPDOMAIN_GLOBAL extern _CRTDATA2 ostream cout;然后我把整个ostream文件搜了个遍,但还是没找到,说了是全局对象,但又怎么也找不到,真欲抱琵琶半遮面,千呼万唤不出现,当时我用了一种变通的方法创造出了我的myout, 怎么做的呢,你猜猜吧,呵呵,言归正传.其实我后来挖掘到这里的时候,产生了一个想法,仔细看我上面的代码,我是先创建一个文件,然后把cout的流重定向到文件,再来看看ostream的第一个构造函数,我笑了,你想到了吗...下面直接给出代码:
//my cout
ofstream console(stdout);
ostream mycout(console.rdbuf());
//my cin
ifstream input(stdin);
ostream myin(input.rdbuf());
//my cerr
ofstream error(stderr);
ostream mycerr(error.rdbuf());
好了,本文到此也应该收笔了, 需要提醒读者的是,io类族中除过ios_base类外其他的都可以用rdbuf进行重定向,而不仅限于cout,本文只是以其示例.还有就是通过重定向可以方便实现其它很多功能,
比如用一个cin语句就可以把键盘输入写道文件等等,读者应该能举一反三.最后,若复制转载请注明原作者,请支持原作.
摘自 不在浮沙筑高台