如何使cout表现为二进制模式?

时间:2011-04-13 18:52:15

标签: c++ iostream cout

每次我做'cout<< endl'或甚至'cout<< “\ n”'然后在Windows下启动我的程序以输出到文件(“a.exe< test.in> result.out”)我在“result.out”中得到“\ r \ n”行结尾。

地球上是否有办法阻止它这样做,只需在每个'cout<<上输出“\ n” “\ n” 个“?

提前致谢。

2 个答案:

答案 0 :(得分:6)

这可以使用Visual Studio 2013:

#include <io.h>
#include <fcntl.h>
#include <iostream>

int main( int argc, char * argv[] )
{
    _setmode( _fileno( stdout ),  _O_BINARY );
    std::cout << std::endl;
}

仅输出[0A],而不输出[0D] [0A]。

答案 1 :(得分:4)

我不相信你可以强制std::cout输出二进制数据。用户通过C ++可用的最低级别界面是streambuf std::cout.rdbuf()。您可以很好地假设该对象的类型为basic_filebuf,而C ++ 11标准的第27.9.1.4节要求basic_filebuf实现单独的文本和二进制模式。

检查特定于平台的扩展,以便使用其文件描述符打开另一个流到stdout的方法。然后,您可以在模式标志中指定std::binary

但是,通过转换行结尾的第二个程序来管道输出可能更容易。

编辑现在,我发现您可能愿意更进一步,让程序直接输出您想要的内容。

只要C ++接口设置为无缓冲模式,就可以使用C接口输出换行符。

在程序的最开始,在cout收到任何输出之前,请执行以下操作:

std::cout.rdbuf()->pubsetbuf( 0, 0 ); // go to unbuffered mode

如果要输出换行符,请执行以下操作:

_write( STDOUT_FILENO, 1, "\n" ); // do not convert line ending

你可以在自定义操纵器中包装这个小... ... ...

#include <unistd.h>

std::ostream &endln( std::ostream &s ) {
    if ( s->rdbuf() == std::cout.rdbuf() ) { // this is cout or cerr into cout
        _write( STDOUT_FILENO, 1, "\n" ); // do not convert line ending
        return s; // stream is unbuffered, no need to flush
    } else {
        return std::endl( s ); // other streams do convert to \r\n
    }
}