C 언어에서 발생할 수 있는 파일 관련 오류
C 언어로 파일을 다룰 때는 다양한 오류 상황이 발생할 수 있습니다. 대표적인 오류 유형은 다음과 같습니다.
- 파일의 끝(EOF)을 넘어 데이터를 읽으려고 시도하는 경우
- 장치 오버플로(Device Overflow)가 발생하는 경우
- 존재하지 않거나 유효하지 않은 파일을 열려고 시도하는 경우
- 파일을 연 모드와 맞지 않는 작업을 수행하는 경우 (예: 읽기 전용 파일에 쓰기 시도)
오류 처리를 위한 주요 함수
C 언어의 표준 라이브러리(stdio.h)는 이러한 오류를 감지하고 처리하기 위해 다음 세 가지 함수를 제공합니다.
- ferror() — 입출력 작업 중 오류 발생 여부 검사
- perror() — 오류 메시지 출력
- feof() — 파일 끝 도달 여부 확인
ferror() 함수
ferror() 함수는 파일 포인터를 대상으로 읽기 또는 쓰기 작업을 수행하는 동안 오류가 발생했는지 감지하는 데 사용됩니다.
함수의 기본 문법은 다음과 같습니다.
int ferror(file pointer);
사용 예시입니다.
FILE *fp;
if (ferror(fp))
printf("오류가 발생했습니다");ferror() 함수는 입출력이 정상적으로 수행되면 0을 반환하며, 오류가 발생한 경우에는 0이 아닌(non-zero) 값을 반환합니다.
perror() 함수
perror() 함수는 화면에 오류 메시지를 출력하는 데 사용됩니다. 이 함수는 인자로 전달된 문자열 뒤에 콜론(:)과 공백, 그리고 현재 발생한 오류에 대한 설명 텍스트를 함께 출력합니다.
함수의 기본 문법은 다음과 같습니다.
perror(string variable);
사용 예시입니다.
FILE *fp; char str[30] = "Error is"; perror(str);
실행 결과
Error is: error 0
ferror()와 perror() 활용 예제
다음은 ferror() 함수와 perror() 함수를 함께 사용하는 C 프로그램 예제입니다.
#include<stdio.h>
main() {
FILE *fp;
char str[30] = "error is";
int i = 20;
clrscr();
fp = fopen("sample.txt", "r");
if (fp == NULL) {
printf("파일이 존재하지 않습니다");
} else {
fprintf(fp, "%d", i);
if (ferror(fp)) {
perror(str);
printf("error ");
}
}
fclose(fp);
getch();
}실행 결과
위 프로그램을 실행하면 읽기 전용으로 열린 파일에 쓰기를 시도하므로 다음과 같은 결과가 출력됩니다.
Error is: Error1 compiler generated. Error.
feof() 함수
feof() 함수는 파일을 읽는 도중 파일의 끝(end of file)에 도달했는지 여부를 확인하는 데 사용됩니다.
함수의 기본 문법은 다음과 같습니다.
int feof(file pointer);
사용 예시입니다.
FILE *fp;
if (feof(fp))
printf("파일의 끝에 도달했습니다");파일의 끝에 도달하여 성공적으로 감지되면 0이 아닌(non-zero) 값을 반환하고, 그렇지 않으면 0을 반환합니다.
feof() 활용 예제
다음은 feof() 함수를 사용하여 파일의 내용을 읽고 파일 끝을 감지하는 C 프로그램 예제입니다.
#include<stdio.h>
main() {
FILE *fp;
int i, n;
clrscr();
fp = fopen("number.txt", "w");
for (i = 0; i <= 100; i = i + 10) {
putw(i, fp);
}
fclose(fp);
fp = fopen("number.txt", "r");
printf("file content is");
for (i = 0; i <= 100; i++) {
n = getw(fp);
if (feof(fp)) {
printf("reached end of file");
break;
} else {
printf("%d", n);
}
}
fclose(fp);
getch();
}실행 결과
위 프로그램을 실행하면 파일에 저장된 숫자들을 차례로 읽어 출력한 후, 파일의 끝에 도달하면 반복문을 종료합니다.
File content is 10 20 30 40 50 60 70 80 90 100 Reached end of the file.
마무리
C 언어에서 안정적인 파일 입출력을 구현하려면 오류 처리가 필수적입니다. ferror()로 입출력 오류를 감지하고, perror()로 구체적인 오류 원인을 사용자에게 알리며, feof()로 파일의 끝을 정확히 판단하면 예기치 않은 비정상 종료나 데이터 손상을 예방할 수 있습니다. 실무 코드에서도 파일을 열 때 NULL 체크와 함께 이 세 가지 함수를 적절히 조합해 사용하는 것이 좋은 습관입니다.