У меня была проблема с чтением файлов Linux под Windows. Вот обсуждение проблемы: Использование fstream ::seekg под окнами в файле, созданном в Unix.
Проблема была устранена путем открытия текстового файла с указанным std::ios_base::binary
.
Но в чем смысл этого режима? Если указано, вы все еще можете работать с файлом как с текстовым файлом (запись с помощью mystream << "Hello World" << std::endl
и чтение с помощью std::getline
).
Под Windows единственная разница, которую я мог заметить, заключается в том, что mystream << "Hello World" << std::endl
использует:
0x0D 0x0A
в качестве разделителя строк, еслиstd::ios_base::binary
не был указан (EOL и возврат каретки)0x0A
в качестве разделителя строк, если было указаноstd::ios_base::binary
(только EOL)
Блокнот некорректно отображает строки при открытии файлов, созданных с помощью std::ios_base::binary
. Лучшие редакторы, такие как vi или Wordpad, их показывают.
Это действительно единственная разница между файлами, сгенерированными с std::ios_base::binary
и без него? В документации написано Consider stream as binary rather than text.
, что это значит в итоге?
Безопасно ли всегда устанавливать std::ios_base::binary
, если мне не нужно открывать файл в Блокноте и я хочу, чтобы fstream::seekg
всегда работало?
\0
символами в строках. В двоичном виде они, вероятно, просто выводятся, в то время как для недвоичного они могут быть интерпретированы как ограничитель строки. - person Gábor Bakos   schedule 18.11.2014