Разница в использовании чтения/записи при открытии потока с использованием/без ios:: двоичного режима

В моих экспериментах со следующим фрагментом кода я не нашел особой разницы, создавал ли я потоки с/без бинарного режима 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();
    }
}

Здесь я пытаюсь скопировать исходный исходный файл в другой файл с другим именем.

Мой вопрос в том, в чем разница между вызовами чтения/записи (которые связаны с двоичным файлом IO) при открытии объекта fstream с/без ios:: двоичного режима? Есть ли преимущество использования двоичного режима? когда и когда не использовать его при выполнении файла IO?

Ответ 1

Единственное различие между режимами binary и text заключается в том, как обрабатывается символ \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  ('\0x0a\0x0d'): Microsoft Windows, DEC TOPS-10, RT-11
CR:   ('\0x0D'):      TRS-80, Mac OS Pre X
RS:   ('\0x1E'):      QNX pre-POSIX implementation.

Ответ 2

Если вы хотите записать файлы в двоичном формате, без каких-либо изменений в ваших данных, укажите флаг ios::binary. Если вы хотите писать файлы в текстовом режиме, не указывайте ios::binary, и вы можете получить такие вещи, как перевод строки завершения. Если вы используете платформу UNIX, бинарные и текстовые форматы одинаковы, поэтому вы не увидите никакой разницы.