16

C ++でファイルIOを実行するには、ofstream、ifstream、およびfstreamクラスを使用します。

  • ofstream:ファイルに書き込むストリームクラス
  • ifstream:ファイルから読み取るストリームクラス
  • fstream:ファイルからの読み取りとファイルへの書き込みの両方へのストリームクラス

ファイルをストリームオブジェクトに関連付けるプロセスは、「ファイルを開く」と呼ばれます。ファイルを開くときに、ファイルを開くモードを指定できます。私のクエリはios::outios:inモードに関連しています。

ofstreamオブジェクトを作成してios::inモードでファイルを開くと、ファイルに書き込むことができますが、それがすでに作成されている場合に限ります(ios::outモードファイルがまだ存在しない場合は作成されます)。
しかし、ifstreamオブジェクトを作成してios::outモードでファイルを開くと、ファイルから読み取ることができます。

私の質問は、ストリームのタイプ( / )自体がどのタイプの操作(入力/出力)が実行されているかを指定するときに、これらのモード( ios::in/ ios::out)が言語によって提供されるのはなぜですか?ifstreamofstream

また、このあいまいな使用法(ofstreamwithios::inおよびifstreamwith ios::out)が、ある場合には機能し、別の場合には失敗するのはなぜですか(ファイルがまだ存在しない場合のみ)。

4

2 に答える 2

12

、およびクラスはofstream、ストリームのメンバー関数を介して取得できる、アンダーリングの高レベルのインターフェイスです。ifstreamfstreamfilebufrdbuf()

標準によれば、ofstreamあるモードmodeでを開くと、と同様に下線付きのストリームバッファが開きますmode | ios_base::out。同様にifstreamを使用しmode | ios_base::inます。パラメータを逐語的に下線を引くストリームバッファにfstream渡します。mode

上記が意味することは、次のコードがまったく同じオープンフラグでファイルを開くことです。

fstream f("a.txt", ios_base::in | ios_base::out);
ifstream g("a.txt", ios_base::out);
ofstream h("a.txt", ios_base::in);

f.rdbuf()これらの行の後、、、g.rdbuf()およびでまったく同じことを行うことができますh.rdbuf()。3つすべてが、C呼び出しでファイルを開いたかのように機能しますfopen("a.txt", "r+")。これにより、読み取り/書き込みアクセスが可能になり、ファイルが切り捨てられず、ファイルが切り捨てられた場合は失敗します。存在しない。

では、なぜ3つの異なるクラスがあるのでしょうか。すでに述べたように、これらは高レベルのクラスであり、低レベルのストリームバッファ上に高レベルのインターフェイスを提供します。アイデアは、ifstream入力用のメンバー関数(のようなread())を持ちofstream、出力用のメンバー関数(のようなwrite())をfstream持ち、両方を持っているということです。たとえば、これを行うことはできません。

g.write("abc", 3); // error: g does not have a write function

しかし、これは機能します。なぜなら、ですgが、次のifstreamように開いたからios_base::outです。

g.rdbuf()->sputn("abc", 3); // we still have write access
于 2012-09-11T08:47:46.020 に答える
0

モードは入出力に限定されないためです。ifstreamたとえば、のコンストラクタは次のようになります。

explicit ifstream ( const char * filename, ios_base::openmode mode = ios_base::in );

デフォルト値はios_base::inであることに注意してください。したがって、自分で指定する必要はありません。ただし、は/に限定されないmodeストリームフラグを設定しますが、次のものが含まれます。inout

  • app(追加)各出力操作の前に、ストリームの位置インジケーターをストリームの最後に設定します。
  • ate(終了時)開始時にストリームの位置インジケーターをストリームの終了に設定します。
  • binary (バイナリ)ストリームをテキストではなくバイナリと見なします。
  • in (入力)ストリームでの入力操作を許可します。
  • out(出力)ストリームでの出力操作を許可します。
  • trunc (切り捨て)開いたときの長さがゼロであると仮定すると、現在のコンテンツはすべて破棄されます。
于 2012-09-11T08:12:06.160 に答える