看了一篇关于C++中标准输出cout的文章,因为最近正搞一个console程序,对于cout如何被实现产生了兴趣。
我能找到的关于cout的内容就只是一个声明:
extern _CRTIMP ostream cout;
具体这个cout是怎么被定义的一无所知,可能不同平台有不同的定义
在vc++6.0实验如下
#include <fstream>
int main(int argc, char* argv[])
{
std::filebuf myfile(&_iob[1]);
std::ostream mycout(&myfile);
mycout<<"test.";
return 0;
}
效果和cout<<"test."完全相同。
cout其实就是输出到标准输出。而标准输出是可以被重定向的,标准输出被重定向后,cout将输出到被重定向后的目标。
vc++6.0中_iob的声明为
_CRTIMP extern FILE _iob[];
_iob[0]为标准输入,_iob[1]为标准输出,_iob[2]为标准错误输出
用VC的debug观察得出_iob的值是固定的。
_iob[0]._file==0
_iob[1]._file==1
_iob[2]._file==2
调用windows API也可以写到标准输出:
DWORD dwByteWrited=0;
WriteFile(GetStdHandle(STD_OUTPUT_HANDLE),"Test StdHandle",13,&dwByteWrited,NULL);
如果标准输出没有被重定向GetStdHandle返回的值似乎固定为7。
标准输出被重定向后GetStdHandle返回的值是其它的不固定值。
这好像涉及到语言在具体平台上的实现了...unix的cout和windows的cout的内部实现应该是不同的...没用过unix,猜测而已