使用/不使用ios :: binary模式打开流时使用读/写的区别

时间:2012-10-07 06:27:11

标签: c++ io filestream binaryfiles

在我使用以下代码片段的实验中,我没有发现是否使用ios创建流的任何特殊区别:二进制模式:

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时何时以及何时不使用它?

2 个答案:

答案 0 :(得分:10)

binarytext模式之间的唯一区别是如何处理'\ n'字符。

binary模式下,有翻译。

text模式\n在写入end of line sequence时被翻译 在text模式end 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.

答案 1 :(得分:1)

如果要以二进制格式编写文件,而不对数据进行任何修改,请指定ios::binary标志。如果要在文本模式下编写文件,请不要指定ios::binary,并且可能会获得行结束翻译等内容。如果您使用的是类UNIX平台,那么二进制和文本格式是相同的,所以您不会看到任何差异。