2017-11-05 19 views
4

나는 iostream 개체에 대해 학습하고 버퍼를 플러시합니다. 출력 버퍼가 플러시되도록 보장되고 명시 적으로 버퍼를 플러시하는 방법을 알고 있습니다. 그러나 출력 버퍼가 이 아니고이 플러시 된 경우를 본 적이 없습니다. endl, flushends과 같은 조작기를 사용하지 않더라도 출력 버퍼가 각 문 끝에서 플러시되는 것으로 보입니다.출력 버퍼가 플러시되지 않는 경우 (들)?

출력 버퍼가 플러시되지 않는 (또는 적어도 자주는 없을 수도있는) 간단한 예제가 있습니까? 출력 버퍼를 실제로 이해할 필요가있는 것처럼 느껴집니다.

+1

버퍼링과 플러시에는 두 가지 레벨이 있습니다. 즉, 기본적으로 cout으로 바뀐 업스트림 개체 내부의 버퍼링과 OS에서 스트림의 버퍼링입니다. – MikeMB

+0

@MikeMB'cout'가 버퍼링을 해제 했습니까? 'unitbuf '를 의미합니까? 그렇지 않다면 사용할 수 있습니까? –

+0

['std :: ios :: sync_with_stdio (false)'] (http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio) – MikeMB

답변

3

시스템에 따라 다릅니다.

를 예로 들어 다음 프로그램을 보자

#include <iostream> 
#ifdef WIN32 
#include <windows.h> 
#define sleep(n) Sleep((n)*1000) 
#else 
#include <unistd.h> 
#endif 

using namespace std; 

int main() 
{ 
    cout << "This is line 1"; 
    sleep(4); 
    cout << endl; 
    cout << "This is line 2" << endl; 

    return 0; 
} 

프로그램을 검사하면 프로그램이 다음 4 초 동안 일시 중지 This is line 2를 인쇄 한 다음, This is line 1를 인쇄 할 것이라는 점을 짐작할 수 있습니다.

그리고 Windows에서 실행되도록 Visual Studio로 컴파일하면 정확한 동작을 얻을 수 있습니다.

그러나 Linux 및 기타 유닉스 운영 체제에서는 두 줄을 함께 인쇄하기 전에 4 초 동안 프로그램이 자동으로 나타납니다. 출력은 새 행 문자가 출력 스트림에서 발견 될 때까지 안정적으로 플러시되지 않습니다.

+0

아, 시스템에 따라 다릅니다. 그래서 Visual Studio를 사용하고 있기 때문에 그런 경우는 본적이 없습니다. 감사! –

+1

"출력 스트림에서 줄 바꿈 문자가 발견 될 때까지는 출력이 안정적으로 플러시되지 않습니다"라는 것이 정확하지 않습니다. 개행'\ n'은 플러쉬를하지 않지만,'std :: endl'은 개행 문자를 출력하고'std :: flush'를 수행하기 때문에 수행합니다. 'std :: endl'은 어떤 경우에는 다소 비싸고, 플러시가 명시 적으로 필요/원하지 않는 한'\ n'을 선호하는 이유는 무엇입니까 -이 경우'std :: endl'은 올바른 도구입니다 . –

+2

@JesperJuhl : std :: cout과 filestreams를 구분하고 iostream 객체를 버퍼링하고 OS/콘솔 창에서 버퍼링해야합니다. 기본적으로 std :: cout은 아무 것도 버퍼링하지 않지만 각 입력을 직접 os에 보내고 (예 : linux의 write를 통해) 보통 개행 문자 (또는 그 이전)를받을 때 자체 버퍼를 플러시합니다. 이 모드에서는'\ n'과'std :: endl'을 사용하는 것과 거의 차이가 없습니다. iostream 객체 내부에서 버퍼링을 활성화하거나 (필터 스트림을 사용하는 경우) 완전히 맞습니다. – MikeMB