izh*_*hak 15 c++ iostream cout
每次我'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;
}
Run Code Online (Sandbox Code Playgroud)
它将仅输出[0A],而不输出[0D] [0A].
我不相信你可以强制std::cout输出二进制数据。用户通过 C++ 可以使用的最低级别的接口是streambufat std::cout.rdbuf()。您可以很好地假设 object 类型为basic_filebuf,并且 C++11 标准的 \xc2\xa727.9.1.4 节要求basic_filebuf实现单独的文本和二进制模式。
检查特定于平台的扩展,了解打开另一个流以stdout使用其文件描述符的方法。std::binary然后您可以在模式标志中指定。
但是,通过第二个转换行结尾的程序来传输输出可能更容易。
\n\n编辑:现在我看到你可能愿意更进一步,真正让程序直接输出你想要的东西。
\n\n只要将 C++ 接口设置为无缓冲模式,就可以使用 C 接口输出换行符。
\n\n在程序的一开始,在cout接收任何输出之前,执行以下操作:
std::cout.rdbuf()->pubsetbuf( 0, 0 ); // go to unbuffered mode\nRun Code Online (Sandbox Code Playgroud)\n\n当你想输出换行符时,可以这样做:
\n\n_write( STDOUT_FILENO, 1, "\\n" ); // do not convert line ending\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n