2013-04-29 16 views
6

私はちょうど疑問に思っています。実際にはstd::fstreamが開かれて、実際にはstd::ios::instd::ios::outの両方が動作するはずですか?それは何をすべきか?何かを(例えば)空のファイルに書いてから、何を読むか?ちょうど書かれた価値?ファイル "ポインタ"/"カーソル"はどこにありますか?多分答えはすでに出ているかもしれませんが、私はそれを見つけられませんでした。std :: fstreamはどのように動作するのでしょうか?

答えて

5

std::fstreamとは何ですか?

std::fstreamは、双方向ファイルストリームクラスです。つまり、ファイルの入力と出力の両方のインタフェースを提供します。これは、ユーザーが同じ外部シーケンスに対して読み書きする必要がある場合によく使用されます。

std::ofstreamまたはstd::ifstreamとは異なり)、双方向ファイルストリームをインスタンス化し、openmodes ios_base::inios_base::outは、デフォルトでを指定しています。

std::fstream f("test.txt", std::ios_base::in | std::ios_base::out); 

が、彼らはまた、いくつかの非デフォルトopenmodesを追加するために、必要に応じて両方のオプションを指定します

std::fstream f("test.txt"); 

一つとして同じになるようtruncateapp、またはbinaryなど:これは、このことを意味します。 ios_base::in openmodeは新しいファイルの作成を無効にするため、という新しいファイルを作成する場合は、ios_base::truncオープンモードが必要です。

双方向I/O

双方向I/Oは、入力と出力の両方のための双方向ストリームの利用です。 IOStreamsでは、標準ストリームは文字列をバッファに保持します。バッファの文字列は、データのソースまたはシンクとして機能します。出力ストリームには、 "put"領域(出力のための文字を保持するバッファ)があります。同様に、入力ストリームの場合、「取得」領域があります。

(入力出力の両方のクラス)の場合、getとputの両方の領域をそれぞれ表す結合ファイルバッファを保持します。ファイル内の現在の位置を示す位置インジケータは、入力操作出力操作の両方によって影響を受けます。そのため、双方向ストリーム上で正しくI/Oを実行するために、あなたが従わなければならない一定のルールがあります。

  • あなたが書き込みまたはその逆の後に読み取りを実行すると、ストリームが戻って再配置する必要があります。
  • 入力操作でファイルの終わりがヒットした場合は、その後に直接書き込みを実行すると問題はありません。

これはstd::fstreamを参照してください。上記のルールはstd::stringstreamでは必要ありません。

これらの質問にお答えいただければ幸いです。それ以上あれば、コメントに尋ねることができます。

関連する問題