2012-11-12 106 views
1

這是我的代碼,因爲它是目前。這段代碼咳嗽了cin.get()的錯誤。我明白這不是好的代碼,它從來不應該是,我只是在測試一些cin的東西。C++ cin.get(),cin.peek()暫停,與stdio相同

#include <string> 
#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main(){ 
    char c[1000]; 
    cin.setstate(cin.eofbit); 
    cout << cin.good() << endl; 
    cout << cin.eof() <<endl; 
    cout << cin.get() << endl; 
    cin.putback('c'); 
    cout << cin.get() << endl; 
    cout << "Do we ever reach this?" << endl; 
    while(1){ 
    }; 
    return 0; 
} 

無論如何。我的問題是cin.get(),cin.peek(),cin.ignore(),getchar(),或幾乎任何cin或stdio函數,你可以命名暫停執行我的程序時,流是空的,沒有設置EOF位或任何東西。這對我來說很刺激,因爲我想檢查流中是否有任何東西,所以我可以清除它,因爲ignore()總是暫停。

我可以工作的唯一方法是'istream :: readsome'。我已經加載到一個字符數組,並使用cout打印它。它打印出一串我不認識的符號(每一個符號都是個別符號)。

http://gyazo.com/e3ee65cdad7ed5cc7b2ce2307ca58c90

強制轉換爲整數,這些出來爲-52,這並不等同於ASCII或Unicode的任何東西。

我使用Visual C++速成2010

請幫忙編譯,我完全在這一點難倒。我只是想讀取字符/沖洗我的流,沒有暫停,如果沒有。我花了3個小時試圖解決這個問題。嘆。

+0

'sync()'丟棄緩衝區中剩下的任何東西,但這種行爲不能保證。 – chris

+0

謝謝,我會看看它。但是,有沒有保證的方法,或者一種方法來防止可怕的暫停,如果我做cin.ignore或cin.peek? – user1819357

+0

沒什麼我知道的,對不起。 – chris

回答

1

爲了擺脫已知的所有字符,你可以結合使用std::istream::ignore()std::streambuf::in_avail()

std::cin.ignore(std::cin.rdbuf()->in_avail()); 

不過,我想這並沒有真正做你想做的:標準的流對象只需閱讀操作系統所傳遞的任何內容。通常,連接到某種控制檯窗口的輸入的默認模式是對輸入進行行緩衝。真正交給流的字符有多少是未定義的。

要檢查輸入流是否有輸入可用,您需要使用特定於平臺的方法。標準C++庫不提供任何非阻塞檢查來查看是否有新數據到達std::cin。在POSIX系統上,您可以使用poll()和文件描述符0來查看std::cin是否有任何數據。非我不知道的非POSIX系統需要什麼。

+0

我有這個小提琴。無論我將多少個字符放入cin,IN_avail總是返回1。的。唯一的辦法就是用sync()來清除它。加上忽視決定暫停的事情,感嘆。謝謝你的迴應,但我不斷挖掘一些能夠在Windows中檢查它的東西 – user1819357