2013-08-09 2 views
6
#include <iostream>                

using namespace std; 

int main() 
{ 
    cout << 1; 
    while (true); 
    return 0; 
} 

이 프로그램은 1을 인쇄 한 다음 중단 될 것으로 생각했습니다. 하지만 아무 것도 인쇄하지 않고 방금 매달 렸습니다. cout << endl 또는 cout.flush()이 문제를 해결할 수 있지만 여전히 예상대로 작동하지 않는 이유를 알고 싶습니다. 이 문제는 codeforces 경연 대회에서 발생했으며 내 프로그램의 이상한 동작을 조사하는 데 많은 시간을 보냈습니다. 그것은 틀린 것이었고, 또한 숨겨진 출력은 실제로 디버깅 정보였습니다.C++ 콘솔 출력 관련 문제

printf (gcc로 컴파일)을 사용해 보았는데 cout뿐만 아니라이 질문도 C로 참조 할 수 있습니다.

+2

'flush'가 동작을 변경한다는 것을 이미 알고 있습니다 ('<< endl'은 암시 적으로 플러시됩니다). ''flush''가 무엇을하는지 읽을 수 있습니다. 거기에 또 뭐라고 말할까요? – Jon

+1

다시 인쇄 할 수 없습니다.이 파일은 VS2012로 인쇄됩니다. – Borgleader

+0

g ++ 및 linux를 사용합니다. –

답변

8

버퍼에 쓰기. 버퍼를 플러시해야합니다. @ Guvante 언급 한대로 cout.flush() 또는 fflush(stdout) printf를 사용하십시오.

업데이트 : fflush 실제로 cout과 함께 작동처럼

보인다. 그러나 그렇게하지 마십시오. 모든 경우에 사실이 아닐 수도 있습니다.

+0

왜 그것이 (사실);없이 플러시하는지 설명 할 수 있습니까? –

+0

'printf'와 C, C++가 아닙니다. –

+1

프로세스가 종료되면 모든 버퍼가 비워집니다. – Eugene

2

cout 버퍼 출력 때문입니다. 실제로 인쇄하려면 버퍼를 플러시해야합니다.

endlflush() 모두이 플러싱을 수행합니다.

또한 무한 루프 (while(true);)가 있으므로 프로그램이 중단됩니다.

이렇게하는 이유는 많은 데이터 (예 : 1000 개의 숫자)를 인쇄 할 때 매우 효율적으로 처리 할 수 ​​있기 때문입니다. 또한 대부분의 사소한 데이터 포인트는 출력이 여러 줄에 걸쳐 있기를 원하기 때문에 endl으로 끝납니다.

+1

내 질문에 대한 말씨는 무한 루프가 의도적 이었음을 나타냅니다. – SirGuy

+0

@GuyGreer : 나는 동의하지만,';'는 그리 쉽지 않기 때문에 그 비트를 포함시킬 필요성을 느꼈다. 특히 "나는 어딘가에서이 코드를 얻었습니다"라는 통지를 받았습니다. – Guvante