2012-12-27 2 views
12

기본적으로 표준 입력 장치는 표준 출력 장치와 함께 std::cin.tie (&std::cout); 형식으로 묶여있어 입력 버퍼를 플러시 한 후 입력해야합니다. 그래서 std::cin.tie(0)을 사용하여 풀기 위해 노력하지만, 그 결과는 묶인 것과 별 차이가없는 것으로 보입니다.왜 우리는 std :: cin과 std :: cout을 묶어야합니까?

#include<iostream> 
using namespace std; 

int main(int argc, char *argv[]) 
{ 
    char c; 

    cin.tie(0) 

    cout << "Please enter c:"; 
    cin >> c; 
    cout << c ; 

    return 0; 
} 

내가 잘못 테스트하고 있습니까? 왜 우리가 그들을 묶어야할까요? 그들은 같은 버퍼를 공유합니까?

+0

동점의 아이디어는 입력을 읽기 전에 프롬프트를 표시해야한다는 것입니다. :-) –

답변

16

예제에 아무런 문제가 없습니다 (단, cin.tie(0) 행 다음에 세미콜론을 추가해야 함). iostream 객체의 작동 방식도 마찬가지입니다.

tie()은 이 입력을 실행하기 전에 cout의 플러시를 보장합니다. 이것은 사용자가 답을 묻기 전에 질문을 보는 데 유용합니다. 당신이 cout에서 cintie()을되지 않는다는 것은 경우

그러나 cout의 버퍼가 플러시 않는다는 보장은 없습니다. 그러나 버퍼가 플러시되지 않는다고 보장 할 수는 없습니다. 실제로 컴퓨터에 충분한 리소스가있는 경우 cout 버퍼 을 즉시으로 플러시하므로 cin 입력을 요청하기 전에이 문제가 발생합니다. 이것은 귀하의 경우에 해당됩니다.

그래서 모든 것이 잘 작동합니다. cin.tie(0) 이후를 제외하고는 플러시가 발생할 것이라는 보장은 없습니다. 그러나 99 %의 경우에는 플러시가 계속 발생하지만 더 이상 보장되지는 않습니다.

묶인 경우 cincout은 같은 버퍼를 공유 할 수 있습니다. 그러나, 나는 그것을 구현하지 않는다고 생각합니다. 한 가지 이유는 두 가지가 서로 묶이지 않을 수 있기 때문입니다.

0

나는 이전의 대답이 틀렸다고 생각한다. (그리고 나는 왜 그렇게 upvoted되고 사실로 표시되어 있는지 분명하지 않다.)

(이전 표준 경우에만) (1) 스트림을 동기화하지 말고 (2) 동기화를 제거해야합니다. 이처럼

:

std::cin.tie (nullptr); 
std::cout.sync_with_stdio(false); 
std::cout << "Please enter c: "; 
std::cin >> c; 

은 그럼 당신은 이 비구 속성 스트림을 가지고을 보장합니다. stdio와의 동기화는 C-style과 C++ 스타일의 입출력을위한 적절한 after-after 주문을하기위한 특별한 능력입니다. 그리고 필자는 실제 필요없이 그것을 제거하지 말 것을 강력하게 권합니다.

관련 문제