mwultong Blog ... 프로그래밍 / 계산기

컴퓨터 엑셀 워드 포토샵 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Tuesday, May 23, 2006

C언어/기초] fopen() 과 fprintf() 함수의 에러 검사 코드


C언어 기초에 대한 게시물입니다. 이 블로그에서 연재 중입니다.


아래에 있는 C언어 소스는 "[C언어] 출력을 파일로 저장할 때는 printf() 가 아닌 fprintf() 함수를"에 있는 간단한 예제에, "에러 검사"를 추가한 버전입니다:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  FILE *out;


  if ( (out = fopen("test.txt", "w")) == NULL) {
    fprintf(stderr, "Error! Cannot open file...\n");
    exit(1);
   }

  if (fprintf(out, "하하하하 %d\nABCD", 1 + 1) == EOF) {
    fputs("Error! Cannot write file...\n", stderr);
    exit(2);
  }

  fcloseall(); // 모든 파일 한꺼번에 닫기
  return 0; // 성공했으니 제로를 반환하며 끝냄
}



fopen() 함수에서 에러가 날 개연성이 가장 높기 때문에 반드시 에러 검사를 해야 합니다. fopen()이 파일 열기에 실패하면 NULL 을 반환합니다.



에러가 나면 에러 메시지를 화면에 출력하는데, fprintf(stderr, "Error! Cannot open file...\n"); 에서 stderr 는 "표준 에러 출력"을 의미하는 가상 파일입니다.

그냥 printf() 함수 등으로 화면에 에러 메시지를 출력하면 곤란합니다. 왜냐하면 재지향을 하고 있을 때에는 에러 메시지가 보이지 않게 되어 버리기 때문입니다. stderr 는 재지향이 되지 않기 때문에, stderr 로 출력하면 항상 에러 메시지가 잘 보이게 됩니다.

즉 fprintf(stderr, ... 라는 것은 파일로 출력하는 것이 아니라 화면으로 출력하는 것입니다.



exit() 함수는, 모든 파일을 닫고, 프로그램을 완전히 끝내는 동시에, 시스템에 에러 코드를 반환하는 함수입니다.

모든 프로그램은, 성공적으로 끝나면 0(제로)를 반환하며 끝내고, 그렇지 않으면 "0이 아닌 정수"를 반환하며 끝내야 합니다.

fputs() 함수는 fprintf() 함수의 좀더 간단하고 빠른 버전입니다.





테스트



에러 검사 코드를 작성했으면, 일부러 에러를 내어서, 에러 검사 코드가 잘 작동하는지 알아보아야 합니다.

test.txt 라는 출력 결과 파일을 "읽기 전용"으로 만든 후, foo.exe 를 다시 실행시키면

D:\Z>foo.exe
Error! Cannot open file...

D:\Z>


이렇게 에러 메시지가 나와야 정상입니다.


그런데 fprintf(out, ... 이 부분에서 인위적으로 에러를 일으키는 방법은 찾지 못했습니다. 하드 디스크에 문제가 있을 때에만 fprintf(out, ... 에서 에러가 만들어질 것입니다.




tag: cpp
C언어 | C/C++ (Visual C++)

0 Comments:

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Previous Posts
Monthly Archives
Top