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