我读了一个文件,发现0x0D
之后有0x0A
。
我只知道它是转换窗口的窗口。
但是我使用了二进制模式,它不能阻止它吗?
ifstream input(inputname, ios::binary);input.get(ch);
我该如何避免它。我只想获得\n
。
写文件怎么样?
提前谢谢。答案 0 :(得分:2)
如果您使用\r\n
行结尾的系统,则在文本模式下打开文件将导致系统自动将这些文件转换为标准\n
没有\r
。以二进制模式打开文件会阻止此转换。
如果您使用不的系统使用此约定,则没有可以转换行结尾的模式。您必须自己手动转换它们或使用外部工具预处理文件。
如果要检测文件是否使用\r\n
,则必须手动执行此操作。浏览文本文件,查看每个\n
前面是否有\r
。
作为替代方案,您可以简单地在处理代码中添加逻辑,以专门处理\r
后跟\n
,而不是试图抢先检测文件使用哪种行结尾。类似的东西:
for (int i=0; i<n; ++i) {
if ('\r' == text[i] && (i+1<n) && '\n' == text[i+1])
++i; // skip carriage return, just handle newline
if ('\n' == text[i])
handle newline...
else
handle other characters
}
答案 1 :(得分:1)
嗯。如果您使用二进制模式,ios::binary
告诉库您要读取文件,因为它是二进制文件(未烹饪,原始)。
使用msdos(现在有些人称之为windows-nt)文本文件由0d0a终止。因此,如果您不想看到这两个字符,您必须以文本模式打开文件(只省略ios :: binary)。
或者您必须通过某些实用程序将这些文件转换为unix样式dos2unix,但是,如果你在Windows系统上,例如记事本可能无法按预期显示此文件...