[英]How to make cout behave as in binary mode?
每次我执行'cout << endl'甚至是'cout <<“ \\ n”',然后在Windows下启动程序以输出到文件时(“ a.exe <test.in> result.out”),我都会得到“ \\ r \\ n”行以“ result.out”结尾。
地球上是否有一种阻止它停止并仅在每个'cout <<“ \\ n”'上输出“ \\ n”的方法?
提前致谢。
这可以在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]。
我不相信您可以强制std::cout
输出二进制数据。 通过C ++对用户可用的最低级别的接口是位于std::cout.rdbuf()
的streambuf
。 您可以很好地假设object为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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.