C++ 便携式线端(换行符)

C++ 便携式线端(换行符),c++,cross-platform,newline,portability,fstream,C++,Cross Platform,Newline,Portability,Fstream,在Windows上使用“\r\n”和“\r\n”时,我不知道这一点,这是一个令人不快的惊喜。(我猜它在Mac上也被替换了…) 有没有简单的方法确保Linux、Mac和Windows用户可以轻松地交换文本文件? 简单地说,我的意思是:不用以二进制模式编写文件,也不用自己测试和替换行尾字符(或者用第三方程序/代码)。这个问题影响了我的C++程序做文本文件I/O.< P>问题根本不在EntL/C> >,这就是文本流的重新格式化取决于系统的标准。 如果您不想这样做,就不要使用文本流——使用二进制流。也就

在Windows上使用
“\r\n”
“\r\n”
时,我不知道这一点,这是一个令人不快的惊喜。(我猜它在Mac上也被替换了…)

有没有简单的方法确保Linux、Mac和Windows用户可以轻松地交换文本文件?


简单地说,我的意思是:不用以二进制模式编写文件,也不用自己测试和替换行尾字符(或者用第三方程序/代码)。这个问题影响了我的C++程序做文本文件I/O.

< P>问题根本不在EntL/C> >,这就是文本流的重新格式化取决于系统的标准。 如果您不想这样做,就不要使用文本流——使用二进制流。也就是说,使用
ios::binary
标志打开文件

也就是说,如果唯一的问题是用户可以交换文件,我根本不需要考虑输出模式,我宁愿确保您的程序可以读取不同的格式而不会阻塞。也就是说,它应该接受不同的行尾


顺便说一句,这是任何像样的文本编辑器都能做到的(不过,Windows上默认的
notepad.exe
不是像样的文本编辑器,无法正确处理Unix换行符)。

如果您真的想要ASCII LF,最简单的方法是以二进制模式打开文件:在非二进制模式下\n由平台特定的行尾序列替换(例如,它可能被LF/CR或CR/LF序列替换;在Unix上,它通常只是LF)。在二进制模式下,这是不做的。关闭替换也是二进制模式的唯一效果


顺便说一句,使用endl相当于先写入一个\n,然后刷新流。通常非预期的刷新可能会成为一个主要的性能问题。因此,endl应该很少使用,并且仅在打算冲洗时使用。

对于与其他答案部分重叠表示歉意,但为了完整性:

神话:
endl
更具可移植性,因为它根据平台约定写入行尾


真相:
endl
被定义为将
\n
写入流,然后调用
flush
。所以事实上你几乎从来都不想用它。所有写入文本模式流的
\n
都会在幕后由CRT隐式转换为
\r\n
,无论您使用的是
还是您使用的是什么编辑器?您使用的是什么源代码管理?@AtesGoral这些与执行基于文本的I/O的可执行文件无关,“不以二进制模式写入文件”。这将是一个“简单”的方法,为什么你要避免它?对不起,但是换行不是“秘密”替换的。这种行为有很好的记录。From:“非二进制文件称为文本文件,由于某些特殊字符(如换行符和回车符)的格式设置,可能会发生一些翻译。”@CharlesBailey事实证明,二进制模式是解决方案。这是因为我缺乏知识…+1:我只能说“\n”(文本模式)被特定于平台的ELS(行尾序列)所取代。@LokiAstari:我不是在提倡
fopen
,这只是最简单、最明确的例子。您可能更喜欢编辑的版本。@ybungalobill:在二进制模式下使用
'\n'
会产生Unix行结尾。在Windows上,这会破坏糟糕的文本编辑器,如记事本和几乎所有粘贴此类内容的文本框(即使是从处理Unix行结尾的编辑器复制)。这真的是你所提倡的,还是我完全误解了你?@Marcelocontos:Notepad是文本编辑的借口。在复制和粘贴时,某些编辑器会将“\n”转换为“\r\n”(例如,我检查过的写字板或web浏览器),尽管我认为理解“\n”是接收者的责任。也就是说,我承认,如果文本文件是为非技术最终用户设计的,那么该指南是不可接受的,因为她不会在意你的程序有多“正确”。@ybungalobill:这与非技术用户无关。据我所知,在Windows上运行的任何文本编辑器都不符合您提倡的策略。默认情况下,即使是emacs和vim也会发出CRLF。不管是否正常,Windows确实区分了文本和二进制,忽视这一点只会自找麻烦。请注意,我并不反对您的建议作为对这个问题的回答,这个问题是关于跨平台可移植性的。让我担心的是,我感觉到您在所有情况下都提倡使用二进制I/O。如果这不是你的意图,那么我很抱歉得出了错误的结论。@Marcelocontos:Notepad++可配置为发出LF。但是如果一些编辑器发出CRLF不是问题,因为当您读取文本文件时,通常忽略空白,而CR只是空白字符,因此您不必从C++读取这些文件。讨论的内容是阅读程序的输出。另外,您是否愿意备份您的声明“Windows确实区分文本和二进制”?我在
CreateFile
中未看到任何文本/二进制相关标志。。。
#include <stdio.h>
#include <iostream>
int main() {
    _fmode = _O_BINARY;
    std::ofstream f("a.txt"); // opens in binary mode
}