4

在我对以下代码片段的实验中,无论我是否使用 ios:binary 模式创建流,我都没有发现任何特别的区别:

int main()
{
    ifstream ostr("Main.cpp", ios::in | ios::binary | ios::ate);
    if (ostr.is_open())
    {
        int size = ostr.tellg();
        char * memBlock = new char[size + 1];
        ostr.seekg(0, ios::beg);
        ostr.read(memBlock, size);
        memBlock[size] = '\0';
        ofstream file("trip.cpp", ios::out | ios::binary);
        file.write(memBlock, size);
        ostr.close();
    }
}

在这里,我试图将原始源文件复制到另一个名称不同的文件中。

我的问题是当使用/不使用 ios::binary 模式打开 fstream 对象时,读/写调用(与二进制文件 IO 相关联)有什么区别?使用二进制模式有什么好处吗?在进行文件 IO 时何时以及何时不使用它?

4

2 回答 2

10

binary和mode之间的唯一区别text是如何处理 '\n' 字符。

binary模式下没有翻译。

In textmode\n在写入时被翻译成end of line sequence.
In textmodeend of line sequence在读入时被翻译成\n.

end of line sequence是平台相关的。

例子:

基于 ASCII 的系统:

LF    ('\0x0A'):      Multics, Mac OS X, BeOS, Amiga, RISC OS
CRLF  ('\0x0D\0x0A'): Microsoft Windows, DEC TOPS-10, RT-11
CR:   ('\0x0D'):      TRS-80, Mac OS Pre X
RS:   ('\0x1E'):      QNX pre-POSIX implementation.
于 2012-10-07T07:34:16.120 回答
1

如果您想以二进制形式写入文件,并且不对数据进行任何修改,请指定该ios::binary标志。当您想以文本模式编写文件时,请不要指定ios::binary,您可能会得到诸如换行之类的东西。如果您在类 UNIX 平台上,二进制格式和文本格式是相同的,因此您不会看到任何区别。

于 2012-10-07T06:31:59.113 回答