5

是否有一个头文件存储系统的行终止字符/s(以便没有任何#ifdefs 它将在所有平台、MAC、Windows、Linux 等上工作)?

4

4 回答 4

5

您应该以“文本模式”(即“不使用二进制”)打开文件,并且换行始终是'\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 之前的硬件了吗?

于 2013-01-29T15:21:34.857 回答
3

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

于 2013-01-29T15:19:23.990 回答
1

看起来标准库中没有任何东西可以获取当前平台的行终止符。

最接近的 API 是

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

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

在 Posix 上,

  • widen('\n')返回'\n'(作为 a char, forchar基于流);
  • endl插入 a'\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'将自动转换为'\r' '\n'Windows。

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

于 2013-01-29T15:28:04.213 回答
1

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

于 2013-01-29T15:56:30.807 回答