找到系统的行终止符

时间:2013-01-29 15:17:20

标签: c++ c header newline

是否存在一个存储系统行终止字符的头文件(因此,如果没有任何#ifdef,它将适用于所有平台,MAC,Windows,Linux等)?

4 个答案:

答案 0 :(得分:3)

不,因为到处都是\n。当您将其写入文本文件时,它会扩展为正确的换行符。

答案 1 :(得分:2)

您应该以“文本模式”(即“不使用二进制”)打开文件,并且换行始终为'\n',无论本机文件是什么。只要合适(即读/写文本文件),C库就会将任何本地字符指示换行符转换为'\n'。请注意,这也意味着您不能依赖“计算读取和使用该字符的数量来”寻找此位置“。

如果文件是二进制文件,则换行符不是新行。

除非你计划在真正古老的系统上运行,并且你真的想要这样做,我会这样做:

#ifdef __WINDOWS__    // Or something like that
#define END_LINE    "\r\n"
#else
#define END_LINE    "\n"
#endif

这在MacOS X之前不适用于MacOS,但是肯定没有人再使用MacOS X之前的硬件了吗?

答案 2 :(得分:1)

标准库中没有任何内容可以获取当前平台的行终止符。

最贴近的API是

char_type  std::basic_ios::widen(char c);

它“将字符c转换为当前语言环境中的等效字符”(cppreference)。我在std::endl的文档中指出了这一点,它“将一个结束行字符插入到输出序列os中并将其刷新,好像通过调用os.put(os.widen('\n'))后跟os.flush()”({{3} })。

在Posix上,

  • widen('\n')返回'\n'char,基于char的流;)
  • endl插入'\n'并刷新缓冲区。

在Windows上,它们完全相同。事实上

#include <iostream>
#include <fstream>
using namespace std;
int main() {
    ofstream f;
    f.open("aaa.txt", ios_base::out | ios_base::binary);
    f << "aaa" << endl << "bbb";
    f.close();
    return 0;
}

将导致只有'\n'的文件作为行终止符。

正如其他人所建议的那样,当文件以文本模式(默认)打开时,'\n'将在Windows上自动转换为'\r' '\n'

(我已经重写了这个答案,因为我错误地认为std::endl已在Windows上翻译为"\r\n"

答案 3 :(得分:1)

Posix要求它是\ n。因此,如果定义了_POSIX_VERSION,则它是\ n。否则,特殊情况下唯一的非POSIX操作系统,Windows,你就完成了。