2013-09-23 2 views
0

Heres는 내 코드바이너리 파일을 두 번 이상 사용할 수 없습니까?

#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; 
} 

출력은 제 1 루프 작동 2 루프 dosent 작업 에서처럼

3 
1 
G:-1 

되기 때문에 포인터의 위치가 -1에도 seekg 사용 후(). 왜 이런 일이 일어나는 걸까요?

답변

3

ifstream이 첫 번째 while 루프 이후에 유효하지 않은 상태이면 스트림에 대한 추가 작업 전에 스트림 상태 플래그를 재설정해야합니다.

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

대신

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

이것은 C++ 98에서 seekg()이 C++ 11과 다르게 동작하기 때문입니다. C++ 98에서는 호출 전에 eofbit 플래그가 설정되면 함수가 실패하고 failbit가 설정되고 반환됩니다. 그것을 확인하기 위해 반환 값을 검사 할 수 있습니다.

C++ 11에서이 함수는 호출 전에 eofbit을 설정하면이 옵션을 지 웁니다.

관련 문제