C 언어 clearerr 사용법 완벽 가이드

clearerr 함수는 C 언어의 표준 입출력 라이브러리에서 파일 스트림의 오류 및 EOF(End-of-File) 플래그를 초기화할 때 사용됩니다. 파일 입출력 과정에서 오류가 발생했을 때 프로그램의 흐름을 제어하고 복구할 수 있도록 도와줍니다.


1. clearerr 함수 기본 문법

#include <stdio.h>

void clearerr(FILE *stream);

매개변수 설명:

  • stream: 오류 상태를 초기화할 파일 포인터입니다.

반환 값:

  • 반환 값이 없습니다. (void 함수)

2. clearerr 사용 목적

  • 파일 스트림에서 발생한 읽기/쓰기 오류 상태를 초기화합니다.
  • EOF 플래그를 리셋하여 다시 읽기/쓰기 작업을 수행할 수 있게 합니다.
  • 오류 발생 후 복구 작업을 수행할 때 사용됩니다.

3. 기본 사용 예제

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (!file) {
        perror("파일 열기 실패");
        return 1;
    }

    int c;
    while ((c = fgetc(file)) != EOF) {
        putchar(c);
    }

    if (feof(file)) {
        printf("파일 끝에 도달했습니다.\\n");
    } else if (ferror(file)) {
        printf("파일 읽기 중 오류가 발생했습니다.\\n");
        clearerr(file);
        printf("오류 상태가 초기화되었습니다.\\n");
    }

    fclose(file);
    return 0;
}

출력 결과:

파일 끝에 도달했습니다.

4. 실전 활용 예제

4.1. 읽기 오류 복구

#include <stdio.h>

int main() {
    FILE *file = fopen("data.txt", "r");
    if (!file) {
        perror("파일 열기 실패");
        return 1;
    }

    char buffer[100];
    if (fgets(buffer, sizeof(buffer), file) == NULL) {
        if (ferror(file)) {
            printf("읽기 중 오류 발생. 오류 플래그 초기화 중...\\n");
            clearerr(file);
        }
    }

    fclose(file);
    printf("오류 초기화 후 정상 종료\\n");
    return 0;
}

출력 결과:

읽기 중 오류 발생. 오류 플래그 초기화 중...
오류 초기화 후 정상 종료

4.2. EOF 플래그 초기화 후 재사용

#include <stdio.h>

int main() {
    FILE *file = fopen("sample.txt", "r");
    if (!file) {
        perror("파일 열기 실패");
        return 1;
    }

    int c;
    while ((c = fgetc(file)) != EOF) {
        putchar(c);
    }

    if (feof(file)) {
        printf("EOF 플래그 초기화 중...\\n");
        clearerr(file);
        rewind(file);  // 파일 포인터를 처음으로 이동

        printf("파일 재읽기 시작\\n");
        while ((c = fgetc(file)) != EOF) {
            putchar(c);
        }
    }

    fclose(file);
    return 0;
}

출력 결과:

(파일의 내용)
EOF 플래그 초기화 중...
파일 재읽기 시작
(파일의 내용)

5. clearerr 사용 시 주의할 점

  1. 파일 포인터 유효성 확인: clearerr 호출 전에 파일 포인터가 NULL이 아닌지 확인해야 합니다.
  2. 버퍼링된 스트림 주의: 버퍼링된 스트림에서 오류 상태를 초기화하더라도, 입출력 작업이 실패할 수 있습니다.
  3. EOF와 오류 구분: feof와 ferror를 사용하여 현재 상태를 구분하고 필요할 때만 clearerr를 사용하세요.

6. 결론

clearerr 함수는 파일 입출력 작업에서 발생할 수 있는 오류와 EOF 상태를 효과적으로 초기화하여 프로그램의 안정성을 향상시킵니다. 오류 복구 작업을 수행할 때 clearerr를 적절히 사용하면 파일 스트림을 재사용하고, 불필요한 프로그램 종료를 방지할 수 있습니다.