2008-10-01 4 views
2

다시 한 번, 선생님이 내 질문에 답할 수 없었습니다. 나는 누가 할 수 있을지 알았다. ...setbuf()가 cout에 영향을 줍니까?

그래서 나는 결코 C를 배웠다. C++에서는 분명히 항상 cout 문을 사용했다. 최근의 할당에, 선생님은 상단에

setbuf(stdout , NULL); 

를 넣어 확인하기 위해 우리에게 주() 따라서 우리가 제대로 출력을 볼 수 있도록, 버퍼링 출력을 얻기 위해서이다.

내 질문은 :이 문이 cout 문 또는 단순히 printf() 문에 영향을 줍니까?

미리 감사드립니다.

답변

6

기본적으로 iostreams와 stdio는 동기화됩니다. Reference.

이렇게해서 stdio 버퍼링을 수동으로 조정하는 것이 좋습니다. std::endl 또는 std::flush (<ostream>)을 활용하면 도움이 될 수 있습니다. 예를 들어, 이들의

std::cout << "Hello, world!" << std::endl; 

또는

std::cout << "Hello, world!\n" << std::flush; 

둘은 같은 일을한다. ( std::endl = 끝 줄을 인쇄 한 다음 플러시하십시오.)

5

기본적으로 stdout 또는 cout이 콘솔에 인쇄되고 있으면 출력은 줄 바꿈됩니다. 이것은 인쇄 된 모든 개행 문자가 출력을 비 웁니다. 출력이 파일로 리디렉션되고 꼬리 -f를 사용하고 실시간으로 특정 출력이 필요한 경우에 비헤이비어를 무시할 때마다 flush()를 명시 적으로 호출 할 수 있습니다.

크리스 말했듯이, sync_with_stdio 대신 표준 출력에 setbuf는을 사용, 버퍼링 cout을 (기본적으로)로 버퍼링 표준 출력을 묶어해야하지만, COUT를 사용하여 당신이하고있는 모든 경우, 더 나은 옵션은 포인터에 pubsetbuf를 사용하는 것입니다 rdbuf에 의해 반환되었습니다. 예 :

// make cout unbuffered 
std::cout.rdbuf()->pubsetbuf(0, 0); 

재미있는 또 다른 기능은 tie입니다.

1

일반적으로 출력을 즉시 확인하는 것이 중요 할 때, 실제로 거래를 상대방에게 보내기 전에 트랜잭션을 모든 방법으로 하드 드라이브에 기록해야하는 매우 안정적인 재무 재 무를 말합니다. 또는 (훨씬 더 일반적인 경우) 프로그램이 충돌하는 경우에도 디버그 메시지를보고 싶습니다.

공부할 때부터 두 번째 사례를 처리한다고 가정합니다. 이 경우 내 충고는 stdout 대신 stderr를 사용하는 것입니다. 기본적으로 unbuffered이며 stdout에서 별도로 리디렉션하여 결과를 한 곳에서 출력하고 다른 출력에서 ​​로깅 할 수 있습니다.

관련 문제