c언어 파일입출력 질문드립니다.

sks93의 이미지

c언어에서 파일입출력을 할때
feof이나 eof로
파일의 끝을 확인하는걸로 알고있습니다.

그런데 만약 파일이 바로 지금 읽어들일 내용이 EOF일 때 0이 아닌 값을 리턴하고
이미 EOF에 도달했거나 넘어섰다면 0을 리턴한다고 알고있습니다.

시작할때 먼저파일을 읽고 그 파일에 제가 찾고자하는 값이 없을경우 파일에 데이터를 넣고 다시 파일을 읽는형식으로 하려합니다.

이때 만약 파일이 비어있는경우 eof를 어떻게 해야하나요?

eof이 파일이 비어있을때도 0을 리턴하기에 좀 애를먹고있네요

bushi의 이미지

feof() 는 그런 함수가 아닙니다. 매뉴얼 읽기 귀찮으면 검색이라도 해보세요.

ozon1000의 이미지

#include <stdio.h>
 
int main(void){
     int state;
     char a;
 
     //데이터를 읽기위한 스트림 생성
     FILE* fp = fopen("D:\\mystory.txt", "rt");
     /* fopen함수는 오류발생시 NULL을 리턴하므로
     파일 개방 중 오류발생시 프로그램을 종료 */
     if (fp == NULL){
          printf("스트림 생성시 오류발생");
          return 1;
     }
 
     /* 파일에 얼마의 데이터가 있는지 모른다고 가정
     무한루프를 돌면서 계속 데이터를 출력
     파일에 끝에 도달하면 feof함수에 의해 반복문 탈출 */
     while (1){
          if (feof(fp) != 0){
               printf("파일의 끝에 도달했습니다.\n");
               break;
          }
 
          //한글자씩 꺼내서 출력
          a = fgetc(fp);
          printf("%c", a);
     }
 
     /* fclose함수는 종료시 오류가 발생하면
     0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
     안내후 프로그램을 종료 */
     state = fclose(fp);
     if (state != 0){
          printf("스트림 제거시 오류발생");
          return 1;
     }
     return 0;
}
Anti-Lock의 이미지

코드만 올리시고 별다른 언급이 없어서 추측하건데,
위의 코드는 '잘못된 활용의 예'일거라고 믿습니다.

마지막으로 실행되는
a = fgetc(fp);
는 a 에 -1 을 집어넣습니다. (EOF 값이 -1 입니다)
따라서 변수 a의 타입은 char 가 아니라 int 가 되어야 합니다.
fgetc 의 함수원형은 다음과 같구요.
int fgetc ( FILE * stream );

그리고 예로 드신 코드에서 fgetc 가 EOF 를 반환하기 이전이라면
feof함수는 별다른 도움이 안됩니다.

ozon1000의 이미지

진짜 잘 이해가 안되서 너무 궁금하네요..
fgetc의 EOF 값이 -1 이기때문에 a의 타입이 char가 아니라 int가 되어야 하는 이유는 무엇인가요?

Anti-Lock의 이미지

조금은 이상하게 적어 놔서 죄송합니다.
char 가 아니라 int 가 되어야 하는 이유는...
1. fgetc 는 int 타입을 반환합니다.
int fgetc ( FILE * stream );
2. fgetc 반환값을 char 로 받을 경우,
스트림에서 읽어들인 데이터 0xff 와 EOF(=-1) 를 서로 구별할 수 없습니다.