사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 파일의 끝 플래그가 설정됬는지 확인한다.
헤더
#include <stdio.h>
※ feof 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※
함수
int feof(FILE* file);
파라미터
- FILE* file
- fopen 함수를 통해 열린 file stream을 입력한다.
- 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]
반응형
'C언어 > stdio.h' 카테고리의 다른 글
[C언어] perror 함수 (stdio.h) (0) | 2022.09.06 |
---|---|
[C언어] ferror 함수 (stdio.h) (0) | 2022.09.05 |
[C언어] ftell 함수 (stdio.h, 파일 크기, stream 위치 구하기) (0) | 2022.09.02 |
[C언어] fseek 함수 (stdio.h, 파일 stream 오프셋 변경) (0) | 2022.08.31 |
[C언어] freopen 함수 (stdio.h) (0) | 2022.08.26 |