1

私は現在、ioストリームフラグのメカニズムをよく理解していないと思います。それを理解するために、2つの具体例について質問します。


最初のものはオープンモードに関するものです。たとえば、std :: ofstreamの場合、次のようになります。

void open ( const char * filename, ios_base::openmode mode = ios_base::out );

app (append) Set the stream's position indicator to the end of the stream before each output operation.
ate (at end) Set the stream's position indicator to the end of the stream on opening.
binary  (binary) Consider stream as binary rather than text.
in  (input) Allow input operations on the stream.
out (output) Allow output operations on the stream.
trunc   (truncate) Any current content is discarded, assuming a length of zero on opening.

次の質問があります。

std::ofstream stream;

// Question 1 : Here I don't specify std::ios::out, so why does it work ? :
stream.open("file.txt", std::ios::binary);

// Question 2 : Here I activate trunc, but how can I deactivate it ?
stream.open("file.txt", std::ios:binary | std::ios::trunc);

// Question 3 : What would be the result of that ?
stream.open("file.txt", std::ios::in);

2つ目は、状態フラグに関するものです。次の例を考えてみましょう。

std::ofstream stream;
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
stream<<'x';
std::cout<<stream.good()<<stream.bad()<<stream.fail()<<stream.eof()<<std::endl;
/* SOMETHING */

ファイルが開かれていないため、結果は次のようになります。

1000 // <- Good bit is true
0110 // <- Fail and bad bit are true

質問4:/* SOMETHING */ toをリセットし、badbittofalseを設定するeofbitために、の代わりに記述できるコードは何ですかtrue(この操作はここでは意味がありませんが、これらのビットの動作を理解するためだけのものです)。


4

1 に答える 1

1

順番に:

  1. `std::ofstream`でopenを呼び出しています。`std :: ofstream::open`の定義は次のとおりです。
    rdbuf()-> open(name、mode | std :: ios_base :: out);
    
    つまり、 `std :: ofstream`は、開くときに常に`out`ビットを追加します。
  2. モードフラグに`std:: ios_base :: app`を追加できますが、これにより、前の位置に関係なく、すべての書き込みがファイルの最後に強制的に適用されます。(これは、書き込みのみで開く場合におそらく必要なものです。)それ以外の場合、 `std :: ios_base::in`と`sdt:: ios_base :: out`の両方で開くと、ファイルは切り捨てられません。 。
  3. ファイルは切り捨てられません:-)。`ofstream`はそれから読み取るための関数を提供しませんが、`rdbuf`によって返される`streambuf`から`std :: istream`を作成し、そこから読み取ることができます。
  4. この場合、 `stream.clear(std :: ios_base :: eofbit)`でうまくいきます。ただし、常に`badbit`をリセットできるとは限りません。`streambuf`がアタッチされていない場合は、何をしても`badbit`が設定されます。

お気づきかもしれませんが、名前は必ずしも直感的ではありません。clearビットを設定するためであり、オープンフラグに関してロジックは直交していません。

于 2012-10-05T16:15:23.747 に答える