이글은 예전 싸이월드 블로그에 작성한 글을 가져온 것입니다.


원문 : 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 함수의 연속적인 호출은 스트림을 위한 EOF 지정자를 지우고
.....블라블라블라~~"
그러므로 fseek() 함수 이후에 호출되는 feof() 함수는 무용지물이 된다는거죠.
위 코드의 while() 문은 아래와 같이 fseek 이전에 feof() 를 호출하도록 수정되어야 합니다.

while(1)
{
    fread(szBuff, 4, 1, fp) ;
    if(feof(fp))
        break ;
    fseek(fp, 184, SEEK_CUR) ;
}
그럼, 즐거운 하루 되세요.



+ Recent posts