在打开流时使用/不使用ios::binary模式的read/write操作有什么区别?

5
在我对以下代码片段进行的实验中,我没有发现使用/不使用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();
    }
}

我在尝试将原始源文件复制到另一个具有不同名称的文件中。

我的问题是当使用二进制文件IO关联的读/写调用时,当fstream对象以/不以ios::binary模式打开时有什么区别? 使用二进制模式是否有任何优势?在进行文件IO时何时使用它,何时不使用?

2个回答

11
binary模式和text模式之间唯一的区别就是如何处理'\n'字符。 在binary模式下,没有任何转换。 在text模式下,\n在写入时会被转换为特定的换行符序列。 在text模式下,换行符序列在读取时会被转换为\n换行符序列取决于所使用的平台。 例如: 基于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.

我理解你所说的内容。但是你能详细说明一下我们应该在哪些情况下选择使用ios::binary或不使用它吗? - Arun
1
个人而言,我从来没有需要翻译的需求,所以我总是使用二进制模式。但如果您正在生成文本文件并希望与本地操作系统的文本编辑软件交互,则文本模式可能更合适(尽管请注意,现代文本编辑软件将处理来自二进制模式的'\n'(或其他系统的行终止序列,但您需要检查))。 - Martin York

2
当您想以二进制方式写入文件时,且不希望修改数据,请指定ios::binary标志。当您想以文本模式写入文件时,请勿指定ios::binary,否则可能会出现行尾转换等情况。如果您在类UNIX平台上,则二进制和文本格式相同,因此您不会看到任何区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接