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

izh*_*hak 15 c++ iostream cout

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

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

提前致谢.

Rob*_*b K 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;
}
Run Code Online (Sandbox Code Playgroud)

它将仅输出[0A],而不输出[0D] [0A].


Pot*_*ter 5

我不相信你可以强制std::cout输出二进制数据。用户通过 C++ 可以使用的最低级别的接口是streambufat std::cout.rdbuf()。您可以很好地假设 object 类型为basic_filebuf,并且 C++11 标准的 \xc2\xa727.9.1.4 节要求basic_filebuf实现单独的文本和二进制模式。

\n\n

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

\n\n

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

\n\n

编辑:现在我看到你可能愿意更进一步,真正让程序直接输出你想要的东西。

\n\n

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

\n\n

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

\n\n
std::cout.rdbuf()->pubsetbuf( 0, 0 ); // go to unbuffered mode\n
Run Code Online (Sandbox Code Playgroud)\n\n

当你想输出换行符时,可以这样做:

\n\n
_write( STDOUT_FILENO, 1, "\\n" ); // do not convert line ending\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以将这个小\xe2\x80\xa6 nugget\xe2\x80\xa6 包装在自定义操纵器中:

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