是否存在一个存储系统行终止字符的头文件(因此,如果没有任何#ifdef
,它将适用于所有平台,MAC,Windows,Linux等)?
答案 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,你就完成了。