0

私のコードはこちら

#include <iostream>
#include <fstream>

using namespace std;

struct a
{
    int x;
    int b;
};

int main ()
{

ifstream rfile("test.bin", ios::binary);
a ob;

//Reading from the file for the first time works fine.
rfile.read((char*)&ob, sizeof(ob));
while (rfile) 
{
    cout<<ob.x<<endl;
    rfile.read((char*)&ob, sizeof(ob));
}
rfile.seekg(0, ios::beg);

cout<<"G:"<<rfile.tellg()<<endl; //Outputs -1
rfile.read((char*)&ob, sizeof(ob));
while (rfile) 
{
    cout<<ob.x<<endl;
    rfile.read((char*)&ob, sizeof(ob));
}


return 0;
}

出力は

3
1
G:-1

最初のループと同様に、seekg() を使用した後でもポインターの位置が -1 であるため、2 番目のループは機能しません。なぜこうなった ?

4

2 に答える 2

3

最初の while ループの後、ifstream が無効な状態になっている場合は、ストリームでさらに操作を行う前に、ストリーム状態フラグをリセットする必要があります。

    rfile.read((char*)&ob, sizeof(ob));
}
rfile.clear();
rfile.seekg(0, ios::beg);

それ以外の

    rfile.read((char*)&ob, sizeof(ob));
}
rfile.seekg(0, ios::beg);
于 2013-09-23T17:20:31.773 に答える
1

これは、C++98 では、seekg()C++11 とは動作が異なるためです。C++98 ではeofbit、呼び出しの前にフラグが設定されている場合、関数は失敗します (failbit を設定して戻ります)。戻り値をチェックして、それを確認できます。

C++11 では、この関数eofbitは呼び出し前に設定された if をクリアします。

于 2013-09-23T17:19:54.273 に答える