이글은 예전 싸이월드 블로그에 작성한 글을 가져온 것입니다.
원문 : http://cy.cyworld.com/home/21147242/post/4D75C4B98555739A07C68401
작성일 : 2011.03.08
------------------------------------------------------------------------
아래 코드를 돌리면 무한루프에 빠집니다.
#include<stdio.h> int main() { FILE* fp = fopen("FacotryStream.trp", "rb") unsigned char szBuff[1024] ; while(!feof(fp)) { fread(szBuff, 4, 1, fp) ; fseek(fp, 184, SEEK_CUR) ; } printf("test finnish~~!!\n") ; return 1 ; } |
언뜻 보기엔 FILE 핸들을 받아 4Bytes 읽고 184Bytes 점프~
그러다 파일 끝에 도달하면 while() 문을 빠져나오는 것 같은데 말이죠.
핵심은 fseek() 함수입니다.
man fseek 해서 나오는 문구를 그대로 인용해보면,
"
핵심은 fseek() 함수입니다.
man fseek 해서 나오는 문구를 그대로 인용해보면,
"
fseek 함수의 연속적인 호출은 스트림을 위한 EOF 지정자를 지우고
.....블라블라블라~~"
그러므로 fseek() 함수 이후에 호출되는 feof() 함수는 무용지물이 된다는거죠.
위 코드의 while() 문은 아래와 같이 fseek 이전에 feof() 를 호출하도록 수정되어야 합니다.
그러므로 fseek() 함수 이후에 호출되는 feof() 함수는 무용지물이 된다는거죠.
위 코드의 while() 문은 아래와 같이 fseek 이전에 feof() 를 호출하도록 수정되어야 합니다.
while(1)
{
fread(szBuff, 4, 1, fp) ;
if(feof(fp))
break ;
fseek(fp, 184, SEEK_CUR) ;
}
그럼, 즐거운 하루 되세요.
'삽질미학 > C,C++' 카테고리의 다른 글
C 코드로 C++ 의 다형성 흉내내기 (0) | 2016.10.14 |
---|---|
map 컨테이너를 이용해 클래스 멤버함수의 콜백함수 등록과 호출하기 (0) | 2016.10.14 |
특정 비트열 가져오는 GETBIT() 함수 (0) | 2016.10.13 |
[펌글] 텔넷 ssh-keygen으로 자동 로그인하기 (2) | 2016.06.19 |
string의 앞뒤 공백제거하기 (0) | 2016.06.19 |