2

質問を説明する例を次に示します。

// Create/truncate file and save '1'
const string NAME = "example.txt";
fstream file(NAME.c_str(), ios::out | ios::trunc);
file << '1';
file.close();

// Re-open file and output its only line
file.open(NAME.c_str(), ios::in | ios::out | ios::app);
string text;
getline(file, text);
cout << "Read \"" << text << "\"" << endl;
// OUTPUTS: Read "1"

// (Try to) Append '2'
file << '2';
file.seekg(0);
getline(file, text);
cout << "Read \"" << text << "\"" << endl;
// OUTPUTS: Read "1"

// (Try to) Append '3'
file.clear(ios::goodbit); /*** SHOULD IT BE NECESSARY TO CLEAR THIS FLAG? ***/
file << '3';
file.seekg(0);
getline(file, text);
cout << "Read \"" << text << "\"" << endl;
// OUTPUTS: Read "13"

よくわからないコード行を含めるのは少し不安です。

前もって感謝します。

4

3 に答える 3

2

getlineeofbit区切り文字(改行)が見つからないため、を設定します。したがって、ストリームには確かにフラグが設定されています。ios::goodbit少しではありませんが、「すべてのフラグがクリアされる」という意味なので、クリアするのはeofbitです。

私はあなたの実装が書き込み時にそのビットに正しく応答することを信頼する傾向があるので、書き込みが失敗したとあなたに告げるなら、私は多かれ少なかれそれを信じます。誰かがおそらく標準ダイビングをして、関連するテキストを見つけるでしょう。

seekg(0)がストリームのeof状態をクリアしないのはなぜですか?C++03とC++11には違いがあると言います。C ++ 11では、を呼び出すとがseekgクリアさeofbitれるため、書き込みに失敗したため、リードバックします"1"。C ++ 03では、への呼び出しseekgはをクリアしないeofbitため、2回目の読み取りは失敗し、textたまたま"1"以前から含まれています。

ほとんどの場合、直後にストリームの状態をチェックせずに使用<<することは正しくありません。>>

if (file << '2') {
    // seekg and so on to confirm what is in the file
} else {
    std::cout << "write failed" << std::endl;
}
于 2012-12-18T11:22:55.637 に答える
1

goodbitクリアできるビットではありません。エラー状態フラグビットが設定されていない状態です。の典型的な実装ではios

struct ios {
  enum iostate {
    goodbit = 0,
    badbit  = 0x1,
    failbit = 0x2,
    eofbit  = 0x4,
  };
};

エラー状態フラグをクリアする必要がある理由はgetline、eofbitが設定された後、<<演算子が効果を持たないためです。これは、エラー状態を出力することで確認できます。

cout << file.rdstate();
于 2012-12-18T11:22:52.937 に答える
0

getline(file、text);

あなたのファイルには改行がないので、これはファイルの最後まで読み上げて設定しますeofbit

その後、クリアするまで、これ以上読み書きすることはできません。eofbit

于 2012-12-18T11:25:55.403 に答える