【问题标题】:How to make cout behave as in binary mode?如何使 cout 表现为二进制模式?
【发布时间】:2011-08-04 23:22:30
【问题描述】:

每次我执行 'cout result.out" ) 我在“result.out”中得到“\r\n”行结尾。

到底有没有办法阻止它这样做,只在每个 'cout

提前致谢。

【问题讨论】:

  • 为什么要这样做? Windows 更喜欢 CRLF 而不是 LF。一些写得不好的应用程序(至少包括默认文本编辑器的旧版本)会遇到麻烦。除非您实际上是在处理二进制数据(问题没有明确说明),否则您不必关心。
  • denlan:根据要求,我的代码应该在 Windows 下运行并产生规范中定义的输出,不幸的是,行分隔符是严格的“\n”。 "\r\n" 破坏了其他也遵循规范的实用程序,并且只期望在输入上使用 "\n" 分隔的文件:( 它或多或少是支持遗留代码/系统的标准混乱。

标签: c++ iostream cout


【解决方案1】:

这适用于 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]。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多