C++ 将std::endl更改为输出CR+;用LF代替LF

C++ 将std::endl更改为输出CR+;用LF代替LF,c++,windows,linux,stl,newline,C++,Windows,Linux,Stl,Newline,我正在Linux平台上编写一个程序,生成的文本文件将不可避免地在Windows平台上查看 现在,将std::endl传递到ostream只为换行生成CR字符。当然,这些文本文件在MS记事本中看起来是错误的 有没有办法改变std::endl,使其使用CR+LF作为换行符而不是LF 我知道我可以编写自己的自定义操纵器,如win_endl,用于生成自己的换行符,但我在很多地方使用std::endl符号,并且像许多程序员一样,倾向于做需要最少工作的事情。我可以简单地重载std::endl来生成CR+LF

我正在Linux平台上编写一个程序,生成的文本文件将不可避免地在Windows平台上查看

现在,将
std::endl
传递到
ostream
只为换行生成CR字符。当然,这些文本文件在MS记事本中看起来是错误的

  • 有没有办法改变std::endl,使其使用CR+LF作为换行符而不是LF
  • 我知道我可以编写自己的自定义操纵器,如
    win_endl
    ,用于生成自己的换行符,但我在很多地方使用
    std::endl
    符号,并且像许多程序员一样,倾向于做需要最少工作的事情。我可以简单地重载
    std::endl
    来生成CR+LF吗,或者这对于可维护性来说是一个愚蠢的想法

  • 注:我已经退房了,但它询问的是另一条路,被接受的答案似乎不完整。

    std::endl
    基本上是:

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

    std::cout您不应该使用\r\n。只需使用\n,然后以“文本”模式打开流,这将为您进行转换。您可能不关心跨平台,但这是官方的做法


    这样,相同的代码将在unix上、windows上和mac上\r\n吐出。

    以文本模式打开文件将导致
    std::endl
    转换为适合您平台的相应行尾。您的问题是newline适合您的平台,但您创建的文件并不适合您的平台


    我不确定您打算如何重载或更改
    endl
    ,而更改其行为对于任何新加入项目的开发人员来说肯定是令人惊讶的。我建议您切换到win_endl(应该是一个简单的搜索和替换),或者可能从标准的
    ostream
    切换到a来为您进行转换。

    Windows记事本几乎是您会发现的唯一一个不能正确处理仅LF文件的Windows程序。几乎所有其他东西(包括写字板)都可以处理LF-only文件


    这个问题是记事本中的一个bug。

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

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

    #define win_endl "\r\n"
    
  • 然后我进行了搜索并替换:

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


  • 并确保所有包含我的文件
    win\u endl.h

    如果这样做,不要忘记以二进制模式打开流-否则,如果您将此代码移植到Windows,您将在输出中获得
    \r\n
    (因为
    \n
    本身将扩展为文本流的
    \r\n
    ),我不这么认为。我们可能无法处理授权问题。lol+1-有关endl操纵器的良好信息。我想我现在会少用它。如果你的文件是文本模式。写入文件时,字符“\n”被转换为特定于平台的行尾序列。从文件中读取时,行尾序列将转换为“\n”。生成文本文件的程序将始终在Linux平台上运行,而不会在Win/Mac上运行。读取文本文件的机器将运行消费类操作系统(Windows、Mac、Linux)。问题是记事本,就像应用程序一样简单,不尊重其他换行符。其他平台默认的文本编辑器会这样做,因此他被迫将其设置为
    \r\n
    ,因此Windows也很不错。+1提醒我我们的客户可以在Mac上运行。我不应该忘记Mac。\r因为EOL是在Mac OS 9上使用的,所以OS X使用了\n。此外,如果您有一个带有\n行结尾的文本文件,如果使用每个windows附带的写字板,您可以轻松查看和编辑该文件。您不会在自己的计算机上执行此操作,因为希望您安装了类似记事本++的东西。但是,如果你在任意电脑上运行,了解写字板的诀窍很好。另一个选择是在Windows上使用一个知道如何处理Unix样式的换行符的工具(即,几乎所有除记事本以外的编辑器),或者使用一个转换行尾的工具(通常称为unix2dos.exe或其他东西)。@Michael Burr-好主意,但我的直觉反应是很难支持我们的客户群。它不必在客户机器上运行——在Unix机器上也有同样的过滤器。在打包分发给客户之前,可以让当前程序生成的输出文件通过过滤器运行。它看起来很笨拙,但我认为它实际上可能比用C++ Stuffio(和它可能远不如工作)更容易搞乱。”Michael Burr -你的第二点也是一个好主意,我想了一点。也许我需要再考虑一下。我之所以回避这个想法的主要原因是我真的想在我的C++应用程序中保持“过滤”,而不是在结果文件上调用外部程序。把你的评论转化为答案,我会给你一个+1。问题是你使用了
    std::endl
    ,因为我们的客户可能只需双击文件,所以我们将任由当时在他们的机器上注册的任何应用程序摆布。可能是Windows上的默认记事本。如果必须创建具有CRLF行结尾的文件,请通过独立于程序本身的筛选器运行输出文件。您可以很容易地找到这种过滤器,查找
    unix2dos
    或类似的东西。这将使您的程序无法使用此特定于平台的逻辑。但是,请不要忘记,Unix程序通常不允许读取包含“\r\n”行结尾的文本文件-从我对Unix的有限经验来看,这似乎是一个更广泛的问题(就处理非本机行尾的程序数量而言)最后,不再是了