5

次のようなファイルを開いた場合:

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

また

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

前者の形式ではできない後者の形式で開かれたファイルで何ができるか、またその逆も同様です。

ありがとうございました

4

4 に答える 4

5

オフストリームの場合、ios::outがデフォルトであるため、違いはありません。ios::out を指定するだけで違いが生じるのは、読み取りまたは書き込み、またはその両方のために開くことができる fstream を使用する場合だけだと思います。

于 2010-02-09T17:51:19.077 に答える
2

標準をチェックアウトすると、セクション 27.8.1.3 でさまざまなios修飾子 (ios::inや などios::out) について説明し、それらを Cfopen()パラメータにマップします。標準によると、ファイルを開くときに修飾子が指定されていない場合、ファイルを開くことはできません。

27.8.1.9 では、そのように動作することがわかりましたofstreamが、ios::out自動的に指定されています。したがって、元の質問に対する答えは、どちらもまったく同じように機能するということです。

どちらかまたはfstreamなしで開始する理由を人々が見つけている理由はわかりませんが、標準を読んだところ、それは機能しないはずです。他の人の 27.8.1.3 の読みに興味があります。ios::inios::out

于 2010-02-09T18:17:38.837 に答える
2

ほとんどの場合、違いはないと思いますが、技術的には実装固有のようです。

私の実装 (gcc 3.4.3) では、オブストリームのオープンは、コンストラクターを介して指定されたものに関係なく、 ofstream->open() 呼び出しで ios:::out モードを使用するため、純粋にオプションです。fstream を使用する場合、これは当てはまらず、明示的に指定する必要があります。

于 2010-02-09T17:57:19.910 に答える
1

私に答えてくれたすべての人に感謝します:私は今、答えられたものに応じていくつかのコードをテストし、この要約を思いつきました:

using ofstream: ios::out は何も指定されていない場合でもデフォルトですが、ofstream で ios::in のみを使用した場合、コンパイル エラーは発生しません (read() または >> または一部の ifstream オブジェクトを使用しない限り)。書かれます。

ifstream の使用: ios::in は何も指定されていない場合でもデフォルトですが、ifstream で ios::out のみを使用した場合、コンパイル エラーは発生しません (write() または << または一部の ofstream オブジェクトを使用しない限り)。ファイルから情報を読み取らない。

fstream: no defaults を使用すると、何をするかを明示的に決定する必要があります。それ以外の場合、コンパイルエラーは発生しませんが、必要なものが得られません。

元の質問に関しては、どちらもまったく同じように機能します!

于 2010-02-09T18:36:32.810 に答える