답변:
일반적으로 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() & unitbuf0이 아니고를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
둘 다 coutI / O 작업을 처리하기 전에 플러시 됩니다. 이렇게하면에 전송 된 프롬프트 cout가 프로그램이에서 입력을 읽는 것을 차단하기 전에 표시 cin되고 이전 출력이를 cout통해 오류를 쓰기 전에 플러시됩니다.cerr 되도록하여 둘 다 동일한 터미널 / 파일 / 기타..
이것은 clog-당신이 거기에 쓰면 버퍼링되지 않고 아무것도 연결되지 않으므로 플러시하기 전에 적절한 크기의 로깅을 버퍼링합니다. 이렇게하면 메시지 처리량이 가장 높지만 터미널을 읽거나 로그를 추적하려는 소비자에게 메시지가 빠르게 표시되지 않을 수 있습니다.
두 cout을 하고 막힘이 버퍼링되지만 cerr는 않은 버퍼이며,이 모든 클래스 ostream에의 인스턴스 인 객체를 미리 정의되어 있습니다. 이 세 가지의 기본 사용은 cout 이 표준 입력에 사용되는 반면 clog 및 cerr 은 오류를 표시하는 데 사용됩니다. cerr 이 버퍼링되지 않은 이유 는 버퍼에 여러 출력이 있고 코드에 오류 예외가 언급되어 있다고 가정하면 해당 오류를 즉시 표시해야하므로 cerr에 의해 수행 될 수 있습니다. 효과적으로 .
내가 틀렸다면 나를 바로 잡으십시오.
stdout,stdin(용cin)이stderr있으며 기본적으로 사용됩니다. 저는 믿습니다clog그냥cerr버퍼링 변화.