代码之家  ›  专栏  ›  技术社区  ›  J. Polfer

将std::endl改为输出CR+LF而不是LF

  •  12
  • J. Polfer  · 技术社区  · 16 年前

    std::endl ostream

    1. 有办法改变吗 std::endl
    2. win_endl std::endl 符号在很多地方,和许多程序员一样,倾向于做需要最少工作的事情。我能简单地超载吗 std::endl 生产CR+LF,还是说这是一个愚蠢的可维护性想法?

    NB:我查过了 this question ,但这是在问是否要走另一条路,而公认的答案似乎相当不完整。

    5 回复  |  直到 9 年前
        1
  •  12
  •   ebo    16 年前

    std::endl 基本上是:

    std::cout << "\n" << std::flush;
    

    所以,只要使用 "\r\n" 而是省略冲洗。这样也更快!

    从endl上的ostream头文件中:

    当需要一个简单的换行符时,经常错误地使用此操纵器,导致缓冲性能不佳。

        2
  •  10
  •   Josh Kelley    16 年前

    以文本模式打开文件应导致 std::endl 转换为适合您平台的行尾。你的问题是换行符 适用于您的平台,但您创建的文件不是针对您的平台的。

    我不确定你打算如何超载或更换 endl ,改变它的行为对于任何新加入你项目的开发人员来说都是令人惊讶的。我建议切换到win_endl(应该是一个简单的搜索和替换),或者从标准切换 ostream Boost.Iostreams filtering stream 为您进行转换。

        3
  •  7
  •   Greg Hewgill    16 年前

    Windows记事本几乎就是 您会发现Windows程序无法正确处理仅LF文件。几乎所有其他东西(包括写字板)都能很好地处理仅支持LF的文件。

    此问题是记事本中的错误。

        4
  •  2
  •   zumalifeguard Arctic    16 年前

    您不应该使用。只需使用,然后以“文本”模式打开流,这将为您完成转换。你可能不关心跨平台,但这是官方的做法。

    这样,在unix、windows和mac上都会输出相同的代码。

        5
  •  0
  •   phuclv    8 年前

    这是我解决这个问题的办法。这有点像是答案中提供的所有信息的混搭:

    1. 我在win_endl.h文件中为我想要的换行符创建了一个宏:

      #define win_endl "\r\n"
      
    2. 然后我进行了搜索和替换:

      sheepsimulator@sheep\_machine > sed -i 's/std::endl/win_endl' *
      

    并确保我的所有文件都包括在内 win_endl.h .