我读了一个文件,发现0x0D
后面有任何0x0A
. 我只知道进行转换的是窗户。
但是我用的是二进制模式,就不能阻止吗?
ifstream input(inputname, ios::binary);input.get(ch);
我该如何避免它。我只想得到\n
.
怎么写文件?
提前谢谢。
我读了一个文件,发现0x0D
后面有任何0x0A
. 我只知道进行转换的是窗户。
但是我用的是二进制模式,就不能阻止吗?
ifstream input(inputname, ios::binary);input.get(ch);
我该如何避免它。我只想得到\n
.
怎么写文件?
提前谢谢。
如果您使用的系统确实使用了行尾,那么以文本\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
}
唔。如果您使用二进制模式,ios::binary
则告诉库您要读取二进制文件(未煮过的,原始文件)。
在文本文件中使用 msdos(现在有些人称之为 windows-nt)的行由 0d0a 终止。因此,如果您不想看到这两个字符,则必须以文本模式打开文件(只需省略 ios::binary)。
或者您必须通过一些实用程序(如 dos2unix)将这些文件转换为 unix 样式,但是,如果您使用的是 Windows 系统,例如记事本可能无法按预期显示这些文件...