флаг skipws устанавливается при открытии потока входного файла в двоичном режиме - PullRequest
2 голосов
/ 31 августа 2011

Я знаю, что оператор извлечения не должен использоваться для входного потока, открытого в двоичном режиме, но вместо него должна использоваться функция-член read.

std::ifstream ifs("file.bin", std::ios::in | std::ios::binary);
char c;
ifs >> c; // Should not be used
ifs.read(&c, 1); // OK

Но это можно сделать в любом случае.Итак, мой вопрос: в чем смысл не снимать флажок skipws в потоках входных файлов при открытии в двоичном режиме?

1 Ответ

4 голосов
/ 31 августа 2011

«Двоичный» режим, управляемый std::ios_base::binary, предназначен только для отключения перевода новых строк между стандартным символом C ++ \n и системной последовательностью новой строки, сохраняемой в файлах.

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

(Стандарт C ++ мало говорит о том, что означает двоичный режим, в стандарте C более подробно говорится о потенциальных различиях между текстовыми потоками и двоичными потоками. Двоичные потоки должны считывать байты за байтом в том виде, в каком они были написано в любой заданной системе, тогда как текстовый поток должен делать это только с учетом ряда ограничений, сосредоточенных вокруг отсутствия лишних пробелов перед новой строкой и отсутствия каких-либо управляющих символов, кроме новых строк и вкладок. Система вообще не должна делать никаких различий между двоичными и текстовые потоки.)

...