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 사용 시 주의할 점
- 파일 포인터 유효성 확인: clearerr 호출 전에 파일 포인터가 NULL이 아닌지 확인해야 합니다.
- 버퍼링된 스트림 주의: 버퍼링된 스트림에서 오류 상태를 초기화하더라도, 입출력 작업이 실패할 수 있습니다.
- EOF와 오류 구분: feof와 ferror를 사용하여 현재 상태를 구분하고 필요할 때만 clearerr를 사용하세요.
6. 결론
clearerr 함수는 파일 입출력 작업에서 발생할 수 있는 오류와 EOF 상태를 효과적으로 초기화하여 프로그램의 안정성을 향상시킵니다. 오류 복구 작업을 수행할 때 clearerr를 적절히 사용하면 파일 스트림을 재사용하고, 불필요한 프로그램 종료를 방지할 수 있습니다.
'Standard C' 카테고리의 다른 글
C 언어 fopen 사용법 완벽 가이드 (0) | 2025.02.22 |
---|---|
C 언어 fclose 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 BUFSIZ 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 sprintf 사용법 완벽 가이드 (0) | 2025.02.22 |
C 언어 memcpy 사용법 완벽 가이드 (0) | 2025.02.22 |