답변:
일반적으로 std::cout
일반 출력, std::cerr
오류 및 std::clog
"로깅"(원하는대로 의미 할 수 있음)에 사용합니다.
가장 큰 차이점은 std::cerr
다른 두 가지처럼 버퍼링되지 않는다는 것입니다.
이전 C stdout
와 관련하여 및 stderr
,에 std::cout
해당하는 stdout
반면 std::cerr
및 std::clog
둘 다에 해당합니다 stderr
( std::clog
버퍼링 된 경우 제외 ).
clog
또한 cerr
. 그래서 그것을 바탕으로 어떤 것을 선택합니까? 경우는 clog
내가 그 오류 스트림에 가고 싶은 이유, 일반적으로 "로깅"입니다? 로그는 cout
오류보다 "일반 로그"(일명 ) 처럼 보입니다 .
cerr
와 clog
표준 "오류"출력을 사용하지만 clog
더처럼 보인다 이유가 될 수있는 버퍼링된다 cout
. 오류 출력을 위해 어느 것을 선택해야합니까? 내가 목록에 올릴 수있는 것보다 더 많은 이유에 따라 다르며 케이스마다 결정되어야합니다.
표준 출력 스트림 (cout) :
클래스 cout
의 인스턴스입니다 ostream
. cout
일반적으로 디스플레이 화면 인 표준 출력 장치에서 출력을 생성하는 데 사용됩니다. 화면에 표시하는 데 필요한 데이터 cout
는 삽입 연산자 ( <<
)를 사용하여 표준 출력 스트림 ( )에 삽입 됩니다.
버퍼링되지 않은 표준 오류 스트림 (cerr) : cerr
오류를 출력하는 데 사용되는 표준 오류 스트림입니다. 이것은 또한 ostream
클래스 의 인스턴스입니다 . 마찬가지로 cerr
입니다 않은 버퍼 우리는 즉시 오류 메시지를 표시 할 때 사용되도록. 오류 메시지를 저장하고 나중에 표시 할 버퍼가 없습니다.
버퍼링 된 표준 오류 스트림 (clog) : 이것은 또한 ostream
클래스 의 인스턴스이며 오류를 표시하는 데 사용되지만 오류와 cerr
는 달리 먼저 버퍼에 삽입되고 완전히 채워지지 않을 때까지 버퍼에 저장됩니다.
추가 읽기 : 기본 입력 출력 c
이 세 가지 스트림의 차이점은 버퍼링입니다.
다음 코드를 확인하고 f (std :: clog), f (std :: cerr), f (std :: out)의 3 줄을 통해 DEBUG를 실행 한 다음 3 개의 출력 파일을 열어 무슨 일이 발생했는지 확인하십시오. 이 세 줄을 바꿔서 무슨 일이 일어나는지 볼 수 있습니다.
#include <iostream>
#include <fstream>
#include <string>
void f(std::ostream &os)
{
std::cin.clear(); // clear EOF flags
std::cin.seekg(0, std::cin.beg); // seek to begin
std::string line;
while(std::getline(std::cin, line)) //input from the file in.txt
os << line << "\n"; //output to the file out.txt
}
void test()
{
std::ifstream in("in.txt");
std::ofstream out("out.txt"), err("err.txt"), log("log.txt");
std::streambuf *cinbuf = std::cin.rdbuf(), *coutbuf = std::cout.rdbuf(), *cerrbuf = std::cerr.rdbuf(),
*clogbuf = std::clog.rdbuf();
std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!
std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!
std::cerr.rdbuf(err.rdbuf());
std::clog.rdbuf(log.rdbuf());
f(std::clog);
f(std::cerr);
f(std::cout);
std::cin.rdbuf(cinbuf);
std::cout.rdbuf(coutbuf);
std::cerr.rdbuf(cerrbuf);
std::clog.rdbuf(clogbuf);
}
int main()
{
test();
std::cout << "123";
}
초안 C ++ 17 표준 문서에서 :
30.4.3 좁은 스트림 객체 [narrow.stream.objects]
istream cin;
1 객체
cin
는 (30.11.1)stdin
에서 선언 된 객체와 관련된 스트림 버퍼의 입력을 제어합니다<cstdio>
.2 객체
cin
가 초기화 된 후를cin.tie()
반환합니다&cout
. 그렇지 않으면 상태는basic_ios<char>::init
(30.5.5.2)에 필요한 것과 동일합니다 .
ostream cout;
3 객체
cout
는 (30.11.1)stdout
에서 선언 된 객체와 관련된 스트림 버퍼에 대한 출력을 제어합니다<cstdio>
.
ostream cerr;
4 객체
cerr
는 다음stderr
에서 선언 된 객체와 관련된 스트림 버퍼에 대한 출력을 제어합니다 .<cstdio>
(30.11.1) .5 객체
cerr
가 초기화 된 후cerr.flags() & unitbuf
0이 아니고를cerr.tie()
반환합니다&cout
. 그렇지 않으면 상태는basic_ios<char>::init
(30.5.5.2)에 필요한 것과 동일합니다 .
ostream clog;
6 개체
clog
는 (30.11.1)stderr
에서 선언 된 객체와 관련된 스트림 버퍼에 대한 출력을 제어합니다<cstdio>
.
cout
에 씁니다 stdout
;cerr
과 clog
에stderr
표준 출력 ( stdout
)은 최종 사용자에게 표시되거나 일부 추가 처리 단계로 스트리밍 될 수있는 성공적인 처리의 출력과 같이 프로그램에서 오류가없는 비 진단 출력을 수신하기위한 것입니다.
표준 에러 (stderr
)는 프로그램이 사용자가 예상 할 수있는 출력을 생성하지 않았거나 생성하지 않았 음을 나타내는 경고 및 오류 메시지와 같은 진단 출력을위한 것입니다. 이 입력은 출력 데이터가 추가 처리 단계로 파이프되는 경우에도 최종 사용자에게 표시 될 수 있습니다.
cin
그리고 cerr
에 묶여있다cout
둘 다 cout
I / O 작업을 처리하기 전에 플러시 됩니다. 이렇게하면에 전송 된 프롬프트 cout
가 프로그램이에서 입력을 읽는 것을 차단하기 전에 표시 cin
되고 이전 출력이를 cout
통해 오류를 쓰기 전에 플러시됩니다.cerr
되도록하여 둘 다 동일한 터미널 / 파일 / 기타..
이것은 clog
-당신이 거기에 쓰면 버퍼링되지 않고 아무것도 연결되지 않으므로 플러시하기 전에 적절한 크기의 로깅을 버퍼링합니다. 이렇게하면 메시지 처리량이 가장 높지만 터미널을 읽거나 로그를 추적하려는 소비자에게 메시지가 빠르게 표시되지 않을 수 있습니다.
두 cout을 하고 막힘이 버퍼링되지만 cerr는 않은 버퍼이며,이 모든 클래스 ostream에의 인스턴스 인 객체를 미리 정의되어 있습니다. 이 세 가지의 기본 사용은 cout 이 표준 입력에 사용되는 반면 clog 및 cerr 은 오류를 표시하는 데 사용됩니다. cerr 이 버퍼링되지 않은 이유 는 버퍼에 여러 출력이 있고 코드에 오류 예외가 언급되어 있다고 가정하면 해당 오류를 즉시 표시해야하므로 cerr에 의해 수행 될 수 있습니다. 효과적으로 .
내가 틀렸다면 나를 바로 잡으십시오.
stdout
,stdin
(용cin
)이stderr
있으며 기본적으로 사용됩니다. 저는 믿습니다clog
그냥cerr
버퍼링 변화.