【问题标题】:Difference in using read/write when stream is opened with/without ios::binary mode使用/不使用 ios::binary 模式打开流时使用读/写的区别
【发布时间】:2012-10-07 06:27:11
【问题描述】:

在我对以下代码 sn-p 的实验中,我没有发现我是否使用 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 什么时候用,什么时候不用?

【问题讨论】:

    标签: c++ io filestream binaryfiles


    【解决方案1】:

    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.
    

    【讨论】:

    • 我明白你所说的。但是你能详细说明一下我们应该在哪里选择一个而不是另一个(有/没有 ios::binary)吗?
    • 就我个人而言,我从来不需要翻译,所以我总是使用二进制模式。但是,如果您正在生成一个文本文件并希望与本地操作系统文本编辑软件进行交互,那么文本模式可能是合适的(尽管请注意现代文本编辑软件将只处理二进制模式中的 '\n' (或从其他系统,但您需要检查))。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      相关资源
      最近更新 更多