web-dev-qa-db-ja.com

C ++でのifstreamオブジェクトのファイルの終わりの状態のリセット

C++でeof状態をリセットする方法があるかどうか疑問に思っていましたか?

19
Steffan Harris

ファイルの場合は、任意の位置を探すことができます。たとえば、最初に巻き戻すには:

_std::ifstream infile("hello.txt");

while (infile.read(...)) { /*...*/ } // etc etc

infile.clear();                 // clear fail and eof bits
infile.seekg(0, std::ios::beg); // back to the start!
_

すでに終わりを過ぎて読んだ場合は、@ Jerry Coffinが示唆するように、clear()でエラーフラグをリセットする必要があります。

26
Kerrek SB

おそらくあなたはiostreamを意味します。この場合、ストリームのclear()がその役割を果たします。

5
Jerry Coffin

私は上記の答えに同意しますが、今夜この同じ問題に遭遇しました。そこで、もう少しチュートリアルで、プロセスの各ステップでのストリームの位置を示すコードを投稿すると思いました。私はおそらくここをチェックするべきでした...前に...私は自分でこれを理解するのに1時間を費やしました。

ifstream ifs("alpha.dat");       //open a file
if(!ifs) throw runtime_error("unable to open table file");

while(getline(ifs, line)){
         //......///
}

//reset the stream for another pass
int pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;     //pos is: -1  tellg() failed because the stream failed

ifs.clear();
pos = ifs.tellg();
cout<<"pos is: "<<pos<<endl;      //pos is: 7742'ish (aka the end of the file)

ifs.seekg(0);
pos = ifs.tellg();               
cout<<"pos is: "<<pos<<endl;     //pos is: 0 and ready for action

//stream is ready for another pass
while(getline(ifs, line) { //...// }
1
user3176017