c 언어/c 표준 라이브러리(Standard C Library)

파일 에러 처리 함수(perror, clearerr, feof, ferror) - C 언어

임베디드 친구 2025. 2. 8. 10:50
728x90
반응형

C 언어에서 파일 입출력 중 에러가 발생할 수 있으며, 이러한 에러를 처리하는 기능이 필요합니다. stdio.h 헤더 파일에는 파일 관련 오류를 확인하고 처리할 수 있는 여러 함수가 제공됩니다. 오늘은 perror, clearerr, feof, ferror 함수에 대해 알아보고 예제 코드를 통해 실제 동작을 확인해 보겠습니다.


1. perror 함수

perror 함수는 마지막으로 발생한 시스템 오류 메시지를 출력하는 함수입니다. 파일 처리 과정에서 오류가 발생하면 perror를 이용해 어떤 오류가 발생했는지 확인할 수 있습니다.

사용법

void perror(const char *s);
  • s: 오류 메시지 앞에 출력할 문자열입니다.

예제

#include <stdio.h>
#include <errno.h>

int main() {
    FILE *file = fopen("non_existent_file.txt", "r");
    if (file == NULL) {
        perror("파일 열기 오류");
        return 1;
    }
    fclose(file);
    return 0;
}

실행 결과 (파일이 존재하지 않을 경우)

파일 열기 오류: No such file or directory

2. clearerr 함수

clearerr 함수는 파일 스트림의 오류 및 EOF(End of File) 상태를 초기화하는 함수입니다.

사용법

void clearerr(FILE *stream);
  • stream: 오류 상태를 초기화할 파일 포인터입니다.

예제

#include <stdio.h>

int main() {
    FILE *file = fopen("test.txt", "r");
    if (file == NULL) {
        perror("파일 열기 오류");
        return 1;
    }

    fgetc(file); // 파일 읽기 시도
    clearerr(file); // 오류 상태 초기화

    if (ferror(file)) {
        printf("파일 오류가 있습니다.\n");
    } else {
        printf("파일 오류가 없습니다.\n");
    }

    fclose(file);
    return 0;
}

실행 결과 (정상적인 파일일 경우)

파일 오류가 없습니다.

3. feof 함수

feof 함수는 파일 스트림의 EOF 상태를 확인하는 함수입니다. 파일을 읽는 도중 EOF에 도달했는지를 확인할 때 사용됩니다.

사용법

int feof(FILE *stream);
  • stream: EOF 상태를 확인할 파일 포인터입니다.
  • 반환값: EOF이면 0이 아닌 값, EOF가 아니면 0을 반환합니다.

예제

#include <stdio.h>

int main() {
    FILE *file = fopen("test.txt", "r");
    if (file == NULL) {
        perror("파일 열기 오류");
        return 1;
    }

    while (!feof(file)) {
        char c = fgetc(file);
        if (feof(file)) break;
        putchar(c);
    }

    printf("\n파일 끝에 도달했습니다.\n");
    fclose(file);
    return 0;
}

실행 결과 (test.txt 내용이 "Hello World"일 경우)

Hello World
파일 끝에 도달했습니다.

4. ferror 함수

ferror 함수는 파일 스트림에서 오류가 발생했는지 확인하는 함수입니다.

사용법

int ferror(FILE *stream);
  • stream: 오류 상태를 확인할 파일 포인터입니다.
  • 반환값: 오류가 발생하면 0이 아닌 값, 오류가 없으면 0을 반환합니다.

예제

#include <stdio.h>

int main() {
    FILE *file = fopen("test.txt", "r");
    if (file == NULL) {
        perror("파일 열기 오류");
        return 1;
    }

    // 파일에서 읽을 내용이 없을 때까지 읽음
    while (fgetc(file) != EOF);

    // EOF 도달 후 추가로 읽기 시도
    fgetc(file);

    if (ferror(file)) {
        printf("파일 읽기 중 오류 발생!\n");
    } else {
        printf("파일 읽기 정상 종료\n");
    }

    fclose(file);
    return 0;
}

실행 결과 (파일이 존재하고 정상적으로 읽혔을 경우)

파일 읽기 정상 종료

실행 결과 (파일이 비정상적으로 닫혔을 경우)

파일 읽기 중 오류 발생!

결론

파일 입출력 과정에서 오류가 발생할 가능성이 많습니다. perror, clearerr, feof, ferror 함수를 적절히 사용하면 오류를 감지하고 해결할 수 있습니다. 이를 통해 프로그램의 안정성을 높이고, 예상치 못한 문제를 방지할 수 있습니다.

파일 오류 처리를 철저히 하면 보다 안전한 C 프로그램을 작성할 수 있습니다. 오늘 소개한 함수들을 적극적으로 활용해 보세요!

반응형