C언어 fprintf stderr - ceon-eo fprintf stderr

C언어 fprintf stderr - ceon-eo fprintf stderr

printf() 함수는 모니터 즉 콘솔창에 값이 출력된다.

그렇다면, fprintf() 함수는 언제 쓸까?

1. 파일에 작성.

fprintf()는 File print의 약자 이다. printf의 사용에 file의 개념만 추가된 것이다.

파일을 열어 그곳에 값을 출력할 수 있다.

예를 들어,

#include<stdio.h>

void main(void)
{
FILE *fp;
fp = fopen("tmp.txt","w");
fprintf(fp, "테스트\n");
fclose(fp);
}

이런 식으로 사용할 수 있다.

tmp.txt.파일을 생성 후 테스트라는 글자를 넣고 종료시킴.

2. fprintf(stderr, "Error!!!!");

fprintf(stderr, "Error!!!!");

stderr, stdin, stdout은 C/C++로 작성한 프로그램에서 지정하지 않아도 자동으로 오픈되는 스트림(파일포인터)이다.

stdin : 표준 입력장치, 보통은 키보드

stdout : 표준 출력장치, 보통은 모니터

stderr : 표준에러출력장치, 보통은 모니터

printf함수가 쓰일때 자연스럽게 stdout을 사용하는데 이는 버퍼링이 존재한다.

stderr로 출력되는 메시지는 버퍼링없이 즉시 출력된다. 따라서 문제가 생겼을 경우 즉시 출력된다.

stderr은 에러메세지를 출력할 장치라는 뜻입니다. 그것이 기본적으로 스크린으로 설정되어 있을 따름이죠.

이것을 파일이라던가. 아니면 프린터라던가로 바꿔주면 바로 stderr 이 파일로 연결되어 에러메세지만 따로 출력이 가능하겠죠

같은 종류로 stdin stdout 이 있는데

기본값으로 stdin은 키보드 stdout 은 스크린으로 설정되어 있습니다.

stderr 과 stdout 이 모두 기본이 스크린으로 되어 있기 때문에 같이 화면으로 출력되는 것입니다.

-------------------------------------------------------------------------------------------------------

stderr은 기본 출력장치인 모니터로 only연결되 있습니다.

stdin,stdout 같은경우는 명령어 프롬프트상에서 리디렉션을 이용해서 출력또는 입력을 재지정이 가능하지만 stderr은 리디렉션을 써도 모니터로 출력이 됩니다.

stdin 기본 입력장치(키보드)
stdout 기본 출력장치(모니터)
stderr 기본 출력장치(모니터)
stdprn 프린터
stdaux 통신포트

그리고 파일닫을때 실패할 경우는 거의 없구요.. 하드에 용량이 부족할때나 실패할 겁니다.(파일을 열고 작업을 할때에는 메모리와 가상메모리상에서 하게 됩니다.)

-------------------------------------------------------------------------------------------------------

 printf() 함수는 무조건 표준 출력 장치 즉, 모니터로만 데이터를 출력할 수 있는 함수입니다.

그런데 fprintf() 함수는 스트림을 지정해줄 수 있는 함수입니다. 스트림을 표준 줄력 장치(모니터)로 지정하면 모

니터로 출려고되고 특정 파일로 지정하게 된다면 그 대상으로 데이터가 전송 되는 것입니다.

예를 들어 스트림을 파일로 지정하고 함수호출을 하게되면 데이터를 특정 형식에 맞춰서 파일에 저장하게 됩니다. 

 

출처 : http://breadlab.wo.tc/100

우리는 많은 스트림을 선택해서 사용할수 있습니다.
stdin 기본 입력장치(키보드) -> 입력
stdout 기본 출력장치(모니터) ->출력
stderr 기본 출력장치(모니터) -> 에러
stdprn 프린터->프린터
stdaux 통신포트->AUX

우리는 stderr을 에러 표시할때 사용합니다.
우리는 이렇게 stderr에 출력할수 있습니다.

fprintf(stderr, "Error Test!");

fprintf가 그냥 파일에 작성하는 함수인줄 아셨다구요?
fprintf는 사실 스트림에 출력하는 함수입니다.
우리가 파일에 작성하는 메커니즘은
FILE* 변수명 = fopen(...);
으로 파일 스트림을 연 후 fprintf로 작성하는거죠.

근데 그냥 printf로 에러라고 써도 될텐데, stdout, stderr 둘다 모니터로 나오는거,
왜 stderr을 쓸까요?

printf를 쓸경우 버퍼 문제로 제대로 출력이 되지 않을 경우가 있습니다.
이렇게 될 경우 에러 메시지 출력을 제때 또는 제대로 못하게 되는 경우도 생기죠. stderr 같은 경우는 버퍼 없이 바로 출력 합니다. 따라서 어떤 상황이 와도 가장 빠르게 에러 메시지를 출력 할수가 있는거죠.

printf(서식 문자열, 인자1... 인자 N) | 출력 위치 : 화면 (console)

fprintf(파일, 서식 문자열, 인자1.. 인자N) | 출력위치 : 지정한 파일(file)

printf() 함수는 무조건 표준 출력 장치 즉, 모니터로만 데이터를 출력할 수 있는 함수입니다.

그런데 fprintf() 함수는 스트림을 지정해줄 수 있는 함수입니다. 스트림을 표준 줄력 장치(모니터)로 지정하면 모니터로 출려고되고 특정 파일로 지정하게 된다면 그 대상으로 데이터가 전송 됩니다.

예를 들어 스트림을 파일로 지정하고 함수호출을식에 하게되면 데이터를 특정 형 맞춰서 파일에 저장하게 됩니다.

stderr,stdin,stdout는 C/C++로 작성한 프로그램에서 달리 지정해주지 않아도 프로그램 시작시 자동으로 오픈되는 스트림(파일포인터)입니다.

stdin,stdout 같은경우는 명령어 프롬프트상에서 리디렉션을 이용해서 출력또는 입력을 재지정이 가능하지만 stderr은 리디렉션을 써도 모니터로 출력이 됩니다.

stdin: 표준입력장치, 보통은 키보드

stdout: 표준출력장치, 보통은 모니터

stderr: 표준에러출력장치, 보통은 모니터

stdprn 프린터

stdaux 통신포트

그렇다면 왜 printf()말고 fprintf를 쓸까???

printf()는 출력 버퍼에 저장되어 있다가 화면에 출력되어, 버퍼에 찰 때 시간이 있다.

때문에, 그 사이에 프로그램이 죽을 경우 버퍼의 내용을 확인하지 못한다.

그러나 fprintf(stderr,)는 버퍼없이 바로 출력된다.

출처 : 네이버 지식인