0

我读了一个文件,发现0x0D后面有任何0x0A. 我只知道进行转换的是窗户。

但是我用的是二进制模式,就不能阻止吗?

ifstream input(inputname, ios::binary);input.get(ch);

我该如何避免它。我只想得到\n.

怎么写文件?

提前谢谢。

4

2 回答 2

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
}
于 2012-12-17T20:27:49.337 回答
1

唔。如果您使用二进制模式,ios::binary则告诉库您要读取二进制文件(未煮过的,原始文件)。
在文本文件中使用 msdos(现在有些人称之为 windows-nt)的行由 0d0a 终止。因此,如果您不想看到这两个字符,则必须以文本模式打开文件(只需省略 ios::binary)。
或者您必须通过一些实用程序(如 dos2unix)将这些文件转换为 unix 样式,但是,如果您使用的是 Windows 系统,例如记事本可能无法按预期显示这些文件...

于 2012-12-17T20:22:33.513 回答