C언어 프로그래밍에서 파일 입출력은 필수적인 기능이지만, 파일이 없거나 권한이 없는 등 예상치 못한 에러가 자주 발생합니다. 프로그램의 안정성을 높이려면 이러한 오류를 단순히 방치하지 않고 정확히 포착하여 처리해야 합니다.
오늘은 stdio.h 라이브러리에서 제공하는 파일 에러 처리 핵심 함수 4인방(perror, clearerr, feof, ferror)의 사용법과 실무 팁을 정리해 보겠습니다.

1. perror 함수: 시스템 에러 메시지 출력
perror는 마지막으로 발생한 시스템 오류를 사람이 읽을 수 있는 텍스트로 변환하여 출력합니다.
- 사용법: void perror(const char *s);
- 특징: 매개변수로 전달한 문자열 뒤에 콜론(:)과 구체적인 에러 원인(예: 파일 없음, 권한 거부 등)을 자동으로 덧붙여 줍니다.
✅ 예제 코드
#include <stdio.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. feof 함수: 파일 끝(EOF) 도달 확인
파일을 읽는 루프에서 현재 포인터가 파일의 끝(End Of File)에 도달했는지 확인할 때 사용합니다.
- 반환값: EOF에 도달했다면 0이 아닌 값(참), 아니면 0(거짓)을 반환합니다.
⚠️ 주의사항: feof는 EOF를 '읽으려고 시도한 후'에 상태가 업데이트됩니다. 따라서 while(!feof(fp))만 사용하면 마지막 문자가 두 번 출력되는 오류가 생길 수 있어, 읽기 직후 한 번 더 체크하는 것이 좋습니다.
✅ 예제 코드
#include <stdio.h>
int main() {
FILE *file = fopen("test.txt", "r");
if (file == NULL) return 1;
char ch;
while (1) {
ch = fgetc(file);
if (feof(file)) break; // EOF 도달 시 즉시 탈출
putchar(ch);
}
printf("\n[파일 끝에 도달하여 읽기를 종료합니다.]\n");
fclose(file);
return 0;
}
3. ferror 함수: 파일 스트림 오류 확인
feof가 파일의 끝을 확인한다면, ferror는 읽기/쓰기 과정에서 발생한 실제 하드웨어적 에러나 논리적 에러를 확인합니다.
- 반환값: 에러 발생 시 0이 아닌 값, 정상일 때 0을 반환합니다.
✅ 예제 코드
#include <stdio.h>
int main() {
FILE *file = fopen("test.txt", "r");
if (file == NULL) return 1;
fgetc(file); // 데이터 읽기
if (ferror(file)) {
printf("파일 스트림에 오류가 감지되었습니다.\n");
} else {
printf("파일 읽기 상태가 정상입니다.\n");
}
fclose(file);
return 0;
}
4. clearerr 함수: 오류 상태 초기화
파일 스트림에 설정된 에러 플래그나 EOF 플래그를 강제로 초기화합니다. 에러를 확인하고 적절한 조치를 취한 뒤, 다시 파일을 다루고자 할 때 필수적입니다.
- 사용법: void clearerr(FILE *stream);
✅ 예제 코드
#include <stdio.h>
int main() {
FILE *file = fopen("test.txt", "r");
// ... 파일 읽기 중 EOF 도달 혹은 에러 발생 가정 ...
clearerr(file); // 상태를 초기화하여 다시 작업 가능한 상태로 만듦
if (!ferror(file) && !feof(file)) {
printf("오류 및 EOF 상태가 초기화되었습니다.\n");
}
fclose(file);
return 0;
}
💡 요약 및 비교
| 함수 | 용도 | 비고 |
| perror | 구체적인 시스템 에러 메시지 출력 | errno 기반 상세 설명 제공 |
| feof | 파일 포인터가 끝(EOF)에 있는지 확인 | 읽기 시도 후에 플래그 설정됨 |
| ferror | 입출력 작업 중 실제 오류 발생 여부 확인 | 0 이외의 값 반환 시 오류 발생 |
| clearerr | EOF 및 에러 플래그 초기화 | 다시 읽기/쓰기 시도 전 사용 |
결론
안전한 C 프로그래밍의 핵심은 '발생할 수 있는 모든 예외를 코드로 제어하는 것'입니다. 오늘 배운 함수들을 적재적소에 활용하여, 단순한 기능 구현을 넘어 견고하고 신뢰할 수 있는 프로그램을 작성해 보세요!
포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!
임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.
'Core Programming > C Standard Library: Resource & Performan' 카테고리의 다른 글
| C언어 문자열 이어붙이기 완벽 가이드: strcat과 strncat의 안전한 사용법 (0) | 2025.02.10 |
|---|---|
| C언어 문자열 함수 총정리: strlen, strcpy, strncpy 안전한 사용법 (0) | 2025.02.09 |
| C언어 파일 포인터 위치 제어: fseek, ftell, rewind 완벽 가이드 (0) | 2025.02.07 |
| C언어 파일 입출력 마스터: fprintf와 fscanf로 데이터 저장 및 읽기 완벽 가이드 (0) | 2025.02.06 |
| C언어 파일 입출력 완벽 가이드: fopen부터 fread, fwrite 바이너리 활용까지 (0) | 2025.02.05 |