每次我做'cout<< endl'或甚至'cout<< “\ n”'然后在Windows下启动我的程序以输出到文件(“a.exe< test.in> result.out”)我在“result.out”中得到“\ r \ n”行结尾。
地球上是否有办法阻止它这样做,只需在每个'cout<<上输出“\ n” “\ n” 个“?
提前致谢。
答案 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
}
}