в файлах C ++: чем файл, открытый как ios :: binary, отличается от файла, открытого как ios :: binary | ИОС :: вне дома? - PullRequest
5 голосов
/ 09 февраля 2010

если я открыл файл как:

ofstream file("file.dat",ios::binary);

или

ofstream file("file.dat",ios::binary | ios::out);

что я могу сделать с файлом, открытым в последней форме, что я не могу сделать с первой формой и наоборот

спасибо

Ответы [ 4 ]

5 голосов
/ 09 февраля 2010

Для ofstream, ios::out является значением по умолчанию, поэтому нет никакой разницы. Я полагаю, что единственное время, определяющее ios :: out, имеет значение, если вы используете fstream, который может быть открыт для чтения или записи, или оба.

2 голосов
/ 09 февраля 2010

Изучая стандарт, в разделе 27.8.1.3 обсуждаются различные модификаторы ios (например, ios::in и ios::out) и отображается их в параметрах C fopen(). Согласно Стандарту, если в открытом файле не указаны модификаторы, открытие завершится неудачей.

В 27.8.1.9 мы находим, что ofstream работает так же, но с ios::out, указанным автоматически. Таким образом, ответ на оригинальный вопрос заключается в том, что оба будут работать одинаково.

Я не знаю, почему люди находят это открытие с fstream без ios::in или ios::out, но мое чтение Стандарта говорит, что это не должно работать. Я был бы заинтересован в чтениях других людей 27.8.1.3.

2 голосов
/ 09 февраля 2010

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

В моей реализации (gcc 3.4.3) open для ofstream использует режим ios ::: out в вызове ofstream-> open () независимо от того, что указано через конструктор, так что это чисто опционально. При использовании fstream это не тот случай, и его необходимо было бы указать явно.

1 голос
/ 09 февраля 2010

спасибо всем, кто мне ответил: Теперь я проверил несколько кодов в зависимости от того, на что мне ответили, и придумал это резюме:

с использованием ofstream: ios :: out является значением по умолчанию, даже если ничего не указано, но если вы используете только ios :: in с ofstream, ошибок компиляции не будет (если вы не используете read () или >> или какой-либо объект ifstream), но файлы не будут записаны.

с использованием ifstream: ios :: in является значением по умолчанию, даже если ничего не указано, но если вы использовали только ios :: out с ifstream, никаких ошибок компиляции (если вы не используете write () или << или какой-либо объект ofstream), но вы не можете прочитать ни одного информация из файла. </p>

с использованием fstream: нет значений по умолчанию, вы должны четко определить, что вы собираетесь делать. В противном случае, нет ошибки компиляции, но вы не получите просто то, что хотите.

Что касается исходного вопроса, оба работают точно так же!

...