5

誰かが微妙な違いを説明できますか:

ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.rdbuf();
f.good() // filestream is bad!!


ofstream f("test.txt")
std::stringstream s;
s<<"";
f << s.str();
f.good() // is still ok!

私は主に .rdbuf() を使用して文字列ストリームをファイルにプッシュしますが (より効率的であるため)、ファイルストリームよりも文字列ストリームが空の場合は...? これはばかげていませんか?よくわからないと思いますが<< s.rdbuf()...

4

1 に答える 1

6

ストリームバッファから文字を抽出できなかった場合、ストリームバッファを「挿入」する挿入演算子 - [ostream.inserters]/9:

関数が文字を挿入しない場合、((27.5.5.4)setstate(failbit) をスローする可能性がある) を呼び出します。ios_base:: failure

一方、文字列を出力する挿入演算子は、明らかに書き込まれた文字数を考慮していません。

これは、ストリーム バッファを挿入すると、ストリーム バッファがストリームに「転送」されるためのようです。文字を抽出できなかった場合、ストリーム バッファ自体にエラーがあったことが最も確実であり、このエラーはストリーム エラー状態で表されます。空のストリームを出力することは、このルールが作成されたときに考慮に入れるほど重要ではないと考えられていた例外です。

于 2014-10-29T23:19:03.603 に答える