fstreamにおけるeofbitの制御

4941 ワード

読み取りファイルが末尾に達したらeofbitを1にします.fstream fileを使用できます.file.clear()eofbitをクリアしてfile.seekg(0)/seekgの2番目のパラメータのデフォルトはios::begです.これにより、ファイルを再読み込みできます.
ファイルを使えばclear(ios::filebit)またはfile.clear(ios::badbit)は、eofbitのビットをクリアしていますが、failbitやbadbitがセットされているため、データを読み取ることができません.だからclear()またはclear(ios::goodbit)/デフォルトパラメータはios::goodbitでなければなりません.
以下を参照してください.http://www.cplusplus.com/reference/ios/basic_ios/clear/
拡張:
1.次の参考資料は次のとおりです.http://blog.csdn.net/jiangxinyu/article/details/7758465
2.標準IOライブラリ定義の------条件状態
標準IOライブラリは、指定されたIOオブジェクトが使用可能な状態にあるか、またはどの特定のエラーが発生したかをマークする一連の条件ステータス(condition state)メンバーを管理します.次のように、標準ライブラリで定義された関数とタグのセットが示されているように、ストリームステータスへのアクセスと操作の手段が提供されます.
strm::iostateこれは機械関連の整数別名で、条件状態を定義するために使用されるタイプを表し、各ioクラスによって定義されます(strmはここで各ストリームタイプを表します).
strm::badbit strm::iostateタイプの値で、破壊されたストリームを示す.
strm::failbit strm::iostateタイプの値で、失敗したIO操作を示す.
strm::eofbit strm::iostateタイプの値で、ストリームがファイル終了子に到達したことを示す.
s.eof()はeofフラグビットの値、真または偽を返します.
s.fail()はfailフラグビットの値、真または偽を返します.
s.bad()はbadフラグビットの値、真または偽を返します.
s.good()はストリームsの有効性を検出し、eof、fail、badが真でない場合goodフラグビットが有効であり、good()関数を呼び出して真値を返す.
s.clear()は、ストリームsのすべての状態値を有効状態にリセットします.
s.clear(flag)は、ストリームsの指定された条件状態を有効にし、flagはstrm::iostateタイプの条件状態であり、カッコ内に具体的な条件状態を書かないとすべての条件状態が有効に設定されます.
s.setstate(flag)はストリームに指定条件を追加し、flagビットをトリガ状態に設定します.flagはstrm::iostateタイプオブジェクトです.
s.rdstate()はストリームsの現在の条件を返し、戻り値タイプはstrm::iostateである.
まとめ-----条件の状態:

  • すべてのストリームオブジェクトにはstrm::iostateタイプのオブジェクトであり、バイナリビットとして使用される条件付きステータスメンバーが含まれます.

  • failbit,eofbit,badbit,goodbitは4つのstrm::iostateタイプの定数値であり、それら自体はそれぞれ条件状態を表し、具体的には以下の表に示す.

  • 定数
    意味
    failフラグビット
    oefフラグビット
    badフラグビット
    ios::badbit
    ファイルの終了に達しました
    0
    0
    1
    ios::eofbit
    入力(出力)ストリームに致命的でないエラーが発生し、挽回できる
    0
    1
    0
    ios::failbit
    入力(出力)ストリームに致命的なエラーが発生し、取り返しがつかない
    1
    0
    0
    ios::goodbit
    フロー状態は完全に正常です
    0
    0
    0

  • badbit,eofbit,failbit,goodbitは4つの基本ストリーム状態を構成する.

  • coutでgoodbit、badbit、eofbit、failbitの値はそれぞれ0,1,2,4で、これは上の表とちょうど完全に対応しているのではないでしょうか、ほほほ(goodbit:0000;badbit:0000;eofbit:0000 0010;failbit:0000 0100).

  • clearとsetstateを使用して、badbit、eofbit、failbit、goodbit、ビットまたは「|」と組み合わせて使用される条件ステータスメンバーを操作および管理できます.

  • bad(),fail(),eof()およびgood()操作を使用して、ストリーム状態が属するかどうかを検出したり、rdstate()を使用して条件状態メンバー全体を返したりすることができます.

  • 2.1 rdstateの使用:
    rdstateメンバー関数はiostateタイプの値を返します.前述したように、ストリームの条件状態全体に対応するマシンに関連する整数です.次のコード:(cplusplus.comより抜粋)
    //getting state of stream object
    #include
    #include
    using namespace std;
    int main ()

    ifstream is; 
    is.open ("test.txt");
    if ( (is.rdstate() & ifstream::failbit ) != 0)/failフラグビットが設定されているか、エラーが発生しているかを検出
    cerr << "Error opening 'test.txt'"; return 0;
    }
    2.2 clearの使用:
    clearは、フラグビットを消去するのではなくフラグビットを設定するために使用されます.すなわち、実パラメータに従ってストリーム状態を設定し、既存の状態を強制的に上書きする方法は2つあります.

  • failbit,eofbit,badbit,goodbitのうちの1つ以上をパラメータとして、具体的な実パラメータに従ってストリームオブジェクトを設定します.例えば、goodbitが実パラメータである場合、ストリーム状態を0に設定します.

  • パラメータなし、すなわちデフォルト状態では、goodbitをパラメータとして持つように、すべてのフラグビットが有効に設定されます.
  • // clearing errors
    #include 
    #include 
    using namespace std;
    
    int main () {
      char buffer [80];
      fstream myfile;
    
      myfile.open ("test.txt",fstream::in);
    
      myfile << "test";
      if (myfile.fail())
      {
        cout << "Error writing to test.txt
    "; myfile.clear(); } myfile.getline (buffer,80); cout << buffer << " successfully read from file.
    "; return 0; }

    2.3 setstateの使用:
    setstateはフラグビット状態を設定するために使用されます.clearとは異なり、既存の状態を強制的に上書きすることなく、既存の状態に基づいて実パラメータ対応状態フラグを重ねて更新するだけです.

  • strmを渡す::iosatateタイプのパラメータ(単一またはビットまたはビットで接続された複数のiostateオブジェクト)

  • 2.次の参考資料は次のとおりです.http://blog.csdn.net/leonardwang/article/details/4881122
    C++ stringstream
    stringstream
    clear()はfailbitビットおよび/またはeofbitビット(badbitビットもある)をクリアします.オペレータ<
    ただし、>>オペレータを使用してstringstreamの状態を変更する可能性がある場合(エラー、行の最後まで)はclear()を使用してstringstreamに新しい値を読み込み続ける必要があります.これは、>>操作がstringstreamからデータストリームを読み出すと、stringstreamはfailbitとeofbitビットを設定し、これらのビットがクリアされないまでデータを読み込めないためです.
    stringstreamの構造、解析関数は時間がかかるので、できるだけ1つだけ作成します.
    eg:
    int main() {  stringstream ss;  string s[2]={"34 43","11 55"};  int temp; for(int i=0;i<2;i++){ss<>temp;cout<//ここまで、ステータスビットは変化していないので、clear()はできません.そうでなければss.eof()のサイクルは永遠に飛び出しない}ss.clear();//次のループで読み込みを続けるために、下のタグビット(eof)をクリアします.そうしないとss}return 0を読み込めません.}
    3.http://bbs.csdn.net/topics/360108849