본문 바로가기

C/C++/C/C++일반

파일 포인터 / feof() 함수 사용 tip

feof() 함수는 파일포인터의 flags값이 _F_EOF일때 1을 반환한다.

 

파일 포인터의 flag 값이 _F_EOF가 되는 경우는 파일 포인터가 지정된 사이즈
만금의 데이터를 읽어 들이지 못했을 때이다.

 

예를 들면 다음과 같이 fread()함수를 사용해서 파일 데이터를 읽어들일 때 어떻게 feof() 함수가 작동되는 지를 확인 할 수 있다.

int nVal = 0;
while(1)
{
    if(feof()) break;          // code1 : 실행안됨
    fread(&nVal, 4, 1, fp);
    if(feof()) break;          // code2 : 실행됨
}

위 코드에서 반복문을 탈출하게 되는 코드는 "code2" 코드가 된다. 즉 일반적으로 아래와 같이 사용되는 코드에서는 정확한 파일의 끝을 알 수 없을 뿐더러 읽을 값을 활용할 경우 문제를 야기시킬 수 있다.

while(!feof(fp))
{
    fread(&nVal, 4, 1, fp);   // <- 이시점에서 파일 포인터가 _F_EOF 값을 갖게되면 아래의 코드는 문제를 일으킬 수 있다.
    fread(&nVal, 4, 1, fp);
    fread(&nVal, 4, 1, fp);
}

위의 코드는 다음과 같이 수정되는 것이 보다 안전하다.


while(1)
{
    fread(&nVal, 4, 1, fp);  
    if(feof(fp)) break; // <-- 첫번째 데이터를 읽고 파일이 종료 되었으면 탈출!
    fread(&nVal, 4, 1, fp);
    fread(&nVal, 4, 1, fp);
}