2009-07-08 2 views
1

, 나는 다음과 같다 몇 가지 코드가 있습니다ifstream seekg beyond end가 VS 2008 Express에서 eof를 반환하지 않습니까? VS 2005 년

ifs.open("foo"); 
while (!ifs.eof()) 
{ 
    ifs.read(&bar,sizeof(bar)); 
    loc = ifs.tellg(); 
    loc += bar.dwHeaderSize; 
    // four byte boundary padding 
    if ((loc % 4) != 0) 
     loc += 4 - (loc % 4); 
    ifs.seekg(loc,ios::beg); 
} 
ifs.close(); 

이 코드는 VS 2005 년에 좋은 일을하지만, VS 2008 Express에서 실패합니다. 내가 말할 수있는 것부터, VS 2008은 코드가 파일의 끝까지 탐색 한 후에 eof()를 반환하지 않습니다. 내가 놓친 게 있니? 탐색 위치가 파일 크기를 초과하는지 명시 적으로 확인하여 추가했지만 ifstream을 올바르게 이해하고 있는지 확인하고자합니다.

답변

2

EOF 플래그는 파일 끝을 지나서 읽은 후에 만 ​​트리거됩니다.
upto을 읽으면 파일 끝이 트리거되지 않습니다.

while(ifs.read(&bar,sizeof(bar))) 
{ 
    // Do Stuff 
} 

읽기()의 결과가 루프가 입력됩니다 EOF 개까지 간다 경우 대부분의 코드는 다음과 같은 이유

이입니다.
읽기()의 결과가

  • 참고 enetered되지 않습니다 루프 EOF지나가는 경우 : 파일에 남아 0 바이트가있는 경우 읽기() 단지 EOF지나 갈 것입니다가. 그렇지 않으면 파일의 끝까지 읽습니다. 그래서 파일에 아무것도 남아 있지 않으면 루프가 항상 입력됩니다.

이유는 읽기 결과 (반환 값)가 스트림에 대한 참조이기 때문입니다. 스트림이 boolean 컨텍스트 (예 : if 테스트 표현식)에서 사용되면 해당 컨텍스트에서 사용할 수있는 유형으로 변환됩니다. 이 변환의 결과는 EOF가 true이면 quivalent를 반환하고 EOF 플래그를 테스트합니다.

참고 :이는 EOF지나 가지 않고 객체에 필요한 정확히 읽어해야 당신이 당신의 바 클래스의 연산자 < < 과부하 경우
이 기술은 잘 작동합니다. 그다음에 파일의 끝까지 정확하게 읽는 것이 더 쉽습니다. 읽기에 대해 걱정할 것은 read()가 10 바이트를 원하고 파일에 5 바이트 만있는 경우 일어날 일입니다. 부분적으로 채워진 객체는 어떻게됩니까?

이 같아야 스타일 코드를 계속 사용하려면 다음

ifs.open("foo"); 
while (!ifs.eof()) 
{ 
    ifs.read(&bar,sizeof(bar)); 
    if (ifs.eof()) 
    { break; 
    } 
    // Do Stuff 
}