Разница в использовании чтения / записи, когда поток открывается с / без 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();
}
}

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

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

4

Решение

Единственная разница между 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.
10

Другие решения

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

1