[C]파일입출력 함수(4)[오류]
이 포스트는 파일입출력함수에서의 오류처리에 관한 내용입니다.
7️⃣ stderr
stderr
스트림도stdout
과 같이 화면에 출력해주지만, 관습상 오류관련 메시지를 출력하는 스트림입니다.- 오류를 바로보여주기때문에 버퍼링을 쓰지않습니다.
- 오류를 숫자(오류코드)로 어딘가에 저장해 둡니다.
stream | 기능 | 장치 |
---|---|---|
stdin | 표준 입력 | 키보드 |
stdout | 표준 출력 | 화면 |
stderr | 표준 에러 | 화면 |
<(1) errno >
- stderr로 생성된 오류코드를
errno
를 통해 볼 수 있습니다. - 헤더파일
<errno.h>
안에 매크로 형식으로 선언되어 있습니다.
int main(void)
{
FILE *stream = fopen("test.txt", "r");
if (stream == NULL)
{
fprintf(stderr, "[%d] error %s\n", errno, "test.txt");
return ;
}
/* 코드 생략 */
}
/*--fopen오류시출력--*/
[2] error test.txt
- 위의 코드처럼
errno
를 사용하면 오류코드를 볼 수 있습니다. - 하지만 숫자의 의미를 모릅니다.(컴파일러마다 오류코드구현이 다르기까지함)
<(2) strerror >
strerror함수
는 이러한 오류코드를 해석해 줍니다.
<함수원형 >
char *strerror(int errnum);
int main(void)
{
FILE *stream = fopen("test.txt", "r");
if (stream == NULL)
{
fprintf(stderr, "%s - %s\n", "test.txt", strerror(errno));
return ;
}
/* 코드 생략 */
}
/*--fopen오류시출력--*/
test.txt - No such file or directory
<(3) perror >
perror함수
는 위의 1,2번의 오류출력과정들을 내부적으로 처리해서 출력해줍니다.
<함수원형 >
void perror(const char* str);
int main(void)
{
FILE *stream = fopen("test.txt", "r");
if (stream == NULL)
{
perror("error test.txt");
return ;
}
/* 코드 생략 */
}
/*--fopen오류시출력--*/
error test.txt: NO such file or directory
<C에서 오류처리 >
- 함수가 곧바로 오류코드를 반환합니다.(내부적으로 오류코드를 전역 변수로 들고 있다가 검사합니다)
stream
을 이용하는 함수는 EOF나 오류시에feof, ferror, errno, strerror, perror
와 같은 함수들로 확인할 수 있음을 지금까지 알아봤습니다.- 하지만 이러한 오류코드가 있는지 까먹을 확률이 크고 문서를 자세히 보지않는이상 내부적으로 이런 것들이 세팅되어 있는지 모를 확률이 큽니다.
- 그렇기 때문에 이런식으로 오류처리를 하는 것이 맞는 것인지 한번 생각해 볼 필요가 있습니다.