C++ C++;获取EOL的大小(以字节为单位)

C++ C++;获取EOL的大小(以字节为单位),c++,newline,eol,C++,Newline,Eol,我正在读一个ASCII文本文件。它由每个字段的大小定义,以字节为单位。例如,每行包含10个字节的字符串,8个字节的浮点值,5个字节的整数,依此类推 我的问题是读取换行符,它的大小根据操作系统的不同而不同(我认为windows通常为2字节,linux通常为1字节) 如何在C++中获得EOL字符的大小?< /P> 例如,在python中,我可以执行以下操作: len(os.linesep) 我不确定翻译是否发生在你认为的地方。请看以下代码: ostringstream buf; buf<&l

我正在读一个ASCII文本文件。它由每个字段的大小定义,以字节为单位。例如,每行包含10个字节的字符串,8个字节的浮点值,5个字节的整数,依此类推

我的问题是读取换行符,它的大小根据操作系统的不同而不同(我认为windows通常为2字节,linux通常为1字节)

如何在C++中获得EOL字符的大小?< /P> 例如,在python中,我可以执行以下操作:

len(os.linesep)

我不确定翻译是否发生在你认为的地方。请看以下代码:

ostringstream buf;
buf<< std::endl;
string s = buf.str();
int i = strlen(s.c_str());
ostringstreambuf;

buf做这件事的由来已久的方法是读一行

现在,最后一个字符应该是
\n
。剥掉它。然后,看前面的角色。它将是
\r
或其他内容。如果是
\r
,请将其剥去

对于Windows[ascii]文本文件,没有任何其他可能性

即使文件是混合的(例如,有些行是
\r\n
,有些行只是
\n

你可以试着在几行上这样做,只是为了确保你没有处理一些奇怪的事情


在这之后,您现在知道了对大多数文件的期望。但是,条带法是一般可靠的方法。在Windows上,可以从Unix导入文件(反之亦然)。

如果以文本模式打开文件,换行符应始终为
'\n'
,无论本机行的结尾是什么。您真的需要知道本机EOL字符串的大小吗?文件是否保证保存在与您的代码读取时运行的操作系统相同的操作系统下?如果是,只需以文本(而非二进制)模式打开文件。此代码错误,因为CRT lib不会将内存缓冲区的
\n
转换为
\r\n
,但会将文件和控制台转换为
\r\n
。在这里,您演示了我遇到的问题。C++将在写入文件/控制台时将“\n”转换为OS特定的字符,而不是缓冲区。@ JRAMM,我认为您还没有充分解释您的问题。代码>\n
在写入缓冲区时不需要(事实上不能)进行任何编码。但是,当您将该缓冲区写入以文本模式打开的文件时,
\n
将自动转换为平台要求的任何内容。然后,如果以文本模式打开同一文件并将其读回,换行符序列将被翻译回
\n
。因此,至少对我来说,不清楚为什么需要知道磁盘上文件中
\n
的编码。这有点吹毛求疵,但如果事先不知道行终止符是什么,就很难
读取行。例如,您的配方对于
\r
行终止符失败,对于保存为
\r\n\n\n
的连续空行也失败,这些空行已在windows land中出现。@dxiv该方法适用于
\r\n\n\n
(例如
\r\n\n\n
)——正如我提到的,这只是混合模式[连续是无问题的]。20多年来,我没有见过一个
\r
唯一的文件[如果有,我已经转换了1000个文件]。许多程序都不可读,因为它们现在假定[至少]换行。在一台计算机上尝试DOS
键入文件我认为连微软都不再支持他们了\r'在行的开头是有效的[作为非终止符](例如,捕获的进度输出)。我已经看到了更多的内容(例如,
\rpgm完成了56%\rpgm完成了57%
)@CraigEstey-旧学校的Mac文件仅\r。参见维基百科:@user3690202我也这么猜,但这超出了OP的问题范围。这样的文件需要在导入到[NTFS]FS时进行转换,才能在WinX下使用——这样OP就永远看不到原始文件了。它们可以自动检测/转换,但最好只是“知道”[通过命令行选项]。行读取的最快方法是通过
mmap
(请参见我的答案:),很容易先进行预扫描,但在99.44%的情况下几乎不值得付出额外的努力。@CraigEstey-我可以想出很多方法来获取CR终止的文本文件。您可以使用linux引导磁盘引导windows机器,并从旧驱动器复制文件,等等。重点是-OP中没有提到windows,将文件复制到windows机器上不会“导入到FS”,如果您真的需要,heck Vim可以在windows机器上生成CR行结束文本文件。这似乎并没有超出问题的“范围”——事实上,这似乎是问题的全部要点,一个你已经错过的要点。