В чем разница между открытием файла с помощью ios::binary или ios::out или обоих?

Я пытаюсь понять разницу между открытием файла, например:

fstream *fileName*("FILE.dat",ios::binary);

or

fstream *fileName*("FILE.dat",ios::out);

or

fstream *fileName*("FILE.dat",ios::binary | ios::out);

Я обнаружил, что все эти формы идентичны: во всех случаях один и тот же вывод в файл производится с использованием либо *fileName*<<, либо *fileName*.write().


person Alan_AI    schedule 08.02.2010    source источник


Ответы (2)


ios::out открывает файл для записи.

ios::binary гарантирует, что данные читаются или записываются без преобразования символов новой строки в \r\n и обратно на лету. Другими словами, именно то, что вы даете потоку, является именно тем, что написано.

person Nick Bedford    schedule 08.02.2010
comment
и что значит использовать оба? - person Alan_AI; 09.02.2010
comment
Ну, вы будете писать в файл без перевода каких-либо символов. - person Nick Bedford; 09.02.2010
comment
Поэтому, если я не помечаю ifstream как двоичный и читаю из него, скажем, 10 удвоений, а Windows находит в данных случайный «\ n», тогда поток расширяется с 10*sizeof(double) до 10*sizeof(double) +1, когда вставляется \r, и перезаписывает конец моего двойного буфера? - person user14717; 10.04.2015

Открытие файла с помощью ios::binary управляет обработкой символов новой строки. В Windows они расширяются до пар CRLF. Вот и все - это не влияет на то, как работают такие вещи, как оператор‹‹.

person Community    schedule 08.02.2010
comment
CLRF означает возврат каретки, перевод строки. Это два байта, используемые для указания новой строки в текстовой кодировке Windows. Это в основном избыточно, потому что на компьютере вам действительно нужен только символ новой строки. - person Nick Bedford; 09.02.2010
comment
Давным-давно, во времена телетайпов и пишущих машинок, у устройств вывода были каретки, которые двигались влево для записи по мере того, как печатались символы. Одна команда, Carriage Return, перемещала каретку обратно влево. Другая команда, Linefeed, переводила бумагу на следующую строку. Эти две команды могут выполняться независимо, так что бумага продвигается по средней строке (используя Linefeed) или перезаписывает текущую строку (используя Carriage Return). В паре они заставляют печать начинаться с левого поля следующей строки. - person Thomas Matthews; 09.02.2010
comment
Люди Unix, будучи нетерпеливыми машинистами, решили, что компьютер должен обрабатывать как Carriage Returns, так и Linefeeds, повышая производительность за счет набора меньшего количества символов. Эта новая команда называлась Newline. В некоторых системах вывода вы могли видеть перемещение каретки влево и продвижение бумаги для каждого Newline, включая пустые строки. Язык C решил помириться и позволить ОС предоставлять переводы (без ios::binary) или не предоставлять переводы (с ios::binary). ios::out определяет направление данных (от компьютера). - person Thomas Matthews; 09.02.2010
comment
спасибо, мистер Томас, не могли бы вы дать мне одно различие между использованием ios::binary и ios::out | ios::binary для открытия файла, разве они не идентичны? - person Alan_AI; 09.02.2010