是否有一个头文件存储系统的行终止字符/s(以便没有任何#ifdef
s 它将在所有平台、MAC、Windows、Linux 等上工作)?
4 回答
您应该以“文本模式”(即“不使用二进制”)打开文件,并且换行始终是'\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 之前的硬件了吗?
不,因为它\n
无处不在。当您将其写入文本文件时,它会扩展为正确的换行符。
看起来标准库中没有任何东西可以获取当前平台的行终止符。
最接近的 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'
(作为 achar
, 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"
Posix 要求它是\n。所以如果定义了_POSIX_VERSION,它就是\n。否则,特殊情况下唯一的非 POSIX 操作系统,windows,你就完成了。