C언어/stdio.h

[C언어] feof 함수 (stdio.h)

아무일도없었다 2022. 9. 4. 21:39

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 파일의 끝 플래그가 설정됬는지 확인한다.

헤더

#include <stdio.h>

※ feof 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

int feof(FILE* file);

파라미터

  • FILE* file
    • fopen 함수를 통해 열린 file stream을 입력한다.

반환값

EOF(-1) 설정시    0이 아닌 값을 반환한다.
EOF(-1) 설정이 아닌 경우  0을 반환한다.

잡학지식

feof 함수는 보통 while 문과 함께 사용하며, 파일의 끝에 도달했는지를 확인할때 사용한다.

컴퓨터에서는 파일의 끝을 인지하기 위해서 End-of-File (EOF) 를 사용하는데 feof 함수 사용시 주의해야 할 점이 있다.

 

feof 는 EOF 를 만나는 순간 0이 아닌값을 반환하는것이 아니라, EOF 이후 다음 문자 읽기를 시도할때 0이 아닌값을 반환하게 된다. 

 

따라서 feof 를 사용한 while 문 안에서 fgets 와 같이 라인단위 데이터가 아닌 1 byte 문자로 끊어서 읽게 된다면 EOF 가 확인되는 시점까지 0을 반환하고 그 이후에 0 이 아닌 값을 반환하게 된다. (자세한 내용 아래 예제 코드 참고)


< test.txt >

abcdef

 

<소스 코드 1> 

#include <stdio.h>

int main() {
    FILE *fp;
    long offset;
    char data;

    fp = fopen("test.txt", "r");
    if (fp != NULL) {
        while(feof(fp) == 0) {
            offset = ftell(fp);
            if (offset != -1) {
                // 1byte 씩 읽는 경우
                data = (char)fgetc(fp);
                printf("current offset[%ld] data[%c](%d)\n", offset, data, (int)data);
            } else {
                // ftell 함수 실패
            }
        }
        fclose(fp);
    }

    return 0;
}

 

※ 실행 결과

current offset[0] data[a](97)
current offset[1] data[b](98)
current offset[2] data[c](99)
current offset[3] data[d](100)
current offset[4] data[e](101)
current offset[5] data[f](102)
current offset[6] data[田�](-1)

 

EOF 에 도달했어도 loop 를 한번 더 수행한것을 확인할 수 있다. (offset 6 의 -1)

<소스 코드 2>

#include <stdio.h>

int main() {
    FILE *fp;
    long offset;
    char buffer[MAX_BUF_SIZE] = {0,};

    fp = fopen("test.txt", "r");
    if (fp != NULL) {
        while(feof(fp) == 0) {
            offset = ftell(fp);
            if (offset != -1) {
                // Line 단위로 읽는 경우
                fgets(buffer, MAX_BUF_SIZE, fp);
                printf("current offset[%ld] data[%s]\n", offset, buffer);
            } else {
                // ftell 함수 실패
            }
        }
        fclose(fp);
    }

    return 0;
}

 

※ 실행 결과

current offset[0] data[abcdef]
반응형