[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와 같은 함수들로 확인할 수 있음을 지금까지 알아봤습니다.
  • 하지만 이러한 오류코드가 있는지 까먹을 확률이 크고 문서를 자세히 보지않는이상 내부적으로 이런 것들이 세팅되어 있는지 모를 확률이 큽니다.
  • 그렇기 때문에 이런식으로 오류처리를 하는 것이 맞는 것인지 한번 생각해 볼 필요가 있습니다.



이전포스트 > [C]파일입출력 함수(3)[스트림 표시자]





© 2021.02. by kirim

Powered by kkrim