2012-12-27 85 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()只是保證在cin執行輸入之前沖洗cout。這對於用戶在被問到答案之前看到問題很有用。

但是,如果從cout這不同於tie()cin,也不能保證cout的緩衝區刷新。但是不能保證緩衝區也不會被刷新。事實上,如果計算機有足夠的資源,它將立即刷新cout緩衝區,所以這發生在cin要求輸入之前。你的例子就是這種情況。

所以,一切正常。除cin.tie(0)之後,不保證沖洗將發生。但是,在99%的情況下,沖洗仍然會發生(但不再保證)。

理論上,如果並列,cincout可以共享相同的緩衝區。但是,我認爲沒有實現這樣做。其中一個原因是這兩個可能是不配合的()d。

0

我想,以前的答案是錯誤的(我想知道爲什麼它如此upvoted和標記爲真,顯然不是)。 (1)刪除與stdio的同步(2)解開流。(1)刪除同步stdio (2)解開流。

像這樣:

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

那你保證有解開流。與stdio同步是一種特殊的能力,以便在對C風格和C++風格的輸入和輸出進行排序之後進行適當的處​​理,並且我強烈建議您在沒有真正需要的情況下將其刪除。

相關問題