我不相信你可以强制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
}
}