关于cout在winows上的实现的讨论?

Posted on 2005-11-14 17:16 Raistlin 阅读(483) 评论(0)  编辑 收藏 引用 所属分类: C++

看了一篇关于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,猜测而已

只有注册用户登录后才能发表评论。

posts - 49, comments - 14, trackbacks - 0, articles - 0

Copyright © Raistlin