2010-03-08 3 views
10

누구나 cerr cout과 clog의 차이점을 설명 할 수 있으며 왜 다른 객체가 제안됩니까?cerr cout 및 clog에 관한 질문

1) cout을 리디렉션 할 수 있지만 cerr는)

이 없습니다 버퍼를 사용할 수 있습니다 방해 :

나는 차이점은 다음과 같습니다 알고있다.

2 점에 대해 혼란 스럽습니다. 누구든지 더 자세히 설명해 주시면 감사하겠습니다.

+17

누가 cer를 리디렉션 할 수 없다고 말하는가? 나는 항상 그것을한다! –

답변

3

버퍼링 된 출력은 일반적으로 버퍼링되지 않은 것보다 훨씬 빠릅니다. 따라서 로그에 방대한 양의 데이터를 빠르게 기록하려면 (실제로 실제로 끝났는지 신경 쓰지 않아도됩니다), cerr보다는 clog를 사용하십시오.

모든 스트림은 보통 유능한 운영 체제라고 가정 할 때 일반적으로 리디렉션 될 수 있지만 "리디렉션"과 같은 개념이없는 C++ 표준을 초과합니다.

+3

cerr/non-buffered-io의 위쪽면에 약간의 정교함을 추가 할 수 있습니다. 즉, 쓰기 작업 직후에 문제가 발생하더라도 스트림이 기록됩니다. –

+0

@RaphaelSP 그게 무슨 뜻인지 "(하지만 실제로 거기에 끝나면 상관 없어)" –

+1

@ Neeil : OP는 겉으로보기에는 버퍼링이 무엇인지 혼란 스럽습니다. –

2

둘 다 리디렉션 될 수 있습니다.
대부분의 구현에서 cerr은 버퍼링되지 않으며 공식적인 POSIX 요구 사항인지는 확실하지 않지만 버퍼링 된 오류 스트림이있는 것이 좋습니다.

개별 스트림이있는 이유는 유닉스 철학에서 한 프로그램의 출력이 다음 프로그램에 대한 입력이라는 것입니다. 'ls'가 곧바로 'sort'로 진행된다면 콘솔에 오류가 나타나기 쉽습니다. 입력이 오류 메시지이거나 정렬 할 텍스트의 일부인지 이해하기 위해 정렬을 작성해야합니다.

16

출력을 버퍼링하거나 버퍼링 할 수 없습니다. 버퍼링 된 출력을 사용하면 구현시 디스크에 (또는 어디서든) 쓸 때까지 모든 출력을 절약 할 수 있습니다. 이것은 훌륭하고 효율적이지만 프로그램이 충돌하면 일부 출력이 손실 될 가능성이 큽니다. 구현시 버퍼가없는 출력을 디스크에 씁니다. 디스크 쓰기가 많으면 속도가 느려질 수 있지만 쓰기가 진행되는 동안 프로그램 충돌이 발생하지 않으면 디스크에 기록됩니다.

표준 출력과 표준 오류 사이에는 실제 기능상의 차이점이 없습니다. 그것들은 별개로 리디렉션 될 수있는 단지 두 개의 다른 출력 스트림입니다. 유닉스 툴을 함께 사용하는 철학은 표준 출력이 다음 툴의 입력으로 갈 수있는 적절한 출력을 가지게 될 것이고, 이것은 오류 메시지를위한 별도의 스트림이 필요하다는 것을 의미한다.

따라서 cout은 표준 출력에 쓰고 버퍼링됩니다. 이것을 정상적인 출력에 사용하십시오. cerr은 표준 오류 스트림에 쓰고 버퍼링되지 않습니다. 오류 메시지에 사용하십시오. clog은 표준 오류 스트림에 기록하지만 버퍼됩니다. 이것은 표준 출력을 방해하지 않기 때문에 실행 로깅에 유용하지만 효율적입니다 (프로그램 충돌시 로그 끝이 손실 될 수있는 비용으로).

1
cout-Screen output(stdout) 
clog-Buffered output of standard error(stderr) 
cerr-Standard error device output (stderr) 
0

버퍼링 된 출력과 버퍼링되지 않은 출력을 사용하는 주된 이유 중 하나는 프로그램 충돌을 예로들 수 있습니다.

로그 파일에 무엇인가를 출력하는 프로그램을 고려하십시오. 그리고 갑자기 프로그램이 추락했습니다. 이 시점에서 어떤 오류로 인해 오류가 발생했는지 파악하는 데 관심이있을 수 있지만 모든 로그 및 오류에 대해 clog (버퍼링 된)를 사용했다면 프로그램이 충돌했을 때 버퍼에 남아있을 수 있으므로이 모든 정보가 표시되지 않을 수도 있습니다. 버퍼도 손실됩니다.

따라서 오류가 발생하는 경우 cerr이 주로 버퍼링되지 않으므로 주로 사용됩니다. 버퍼에 있었기 때문에 프로그램 오류가 발생했을 때 중대한 오류가 없어지면 아무런 문제가 없습니다.