2017-01-22 131 views
2

標題是誤導,因爲我更感興趣的是找到一個替代的解決方案。我的直覺是,檢查緩衝區是否爲空並不是最理想的解決方案(至少在我的情況下)。C++如何檢查是否給std :: cin緩衝區爲空

我是新的C++和使用C++一直遵循了Bjarne Stroustrup的編程原則和做法。目前我在第7章,我們在哪裏「煉」從第6章計算器(我把對源代碼的鏈接問題的結束。)

基本上,計算器可以採取多用戶輸入,用分號分隔。

> 5+2; 10*2; 5-1; 
      = 7 
>   = 20 
>   = 4 
> 

但我想擺脫提示字符(「>」),最後兩個答案,並再次顯示它,只有當用戶輸入要求。我的第一本能是找到一種方法來檢查緩衝區是否爲空,如果是,請關閉角色,如果沒有,請繼續回答問題。但經過一番Google搜索之後,我意識到這項任務並不像我最初想象的那麼容易......而且也許這可能不是一個好主意。

我想基本上我的問題是如何擺脫「>」字符爲當有多個輸入的最後兩個答案。但是,如果檢查CIN緩衝可能是不是一個壞主意,畢竟,我很想知道如何做到這一點。

的源代碼:https://gist.github.com/Spicy-Pumpkin/4187856492ccca1a24eaa741d7417675

頭文件:http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h

^你需要這個頭文件。我認爲它是由作者自己寫的。

編輯:我沒看網上的一些解決方案,繞不過是他們中的誠實沒有作出任何意義,我。它一直樣4日以來,我拿起了C++和我在編程非常薄的背景,所以有時甚至是谷歌搜索是有點困難..

+1

用棍子戳,看看它是否咆哮。 –

+1

類似的問題:http://stackoverflow.com/questions/3317740/checking-data-availability-before-calling-stdgetline –

+0

在這種情況下,您可以使用'std :: getline'一次讀取整行,並顯示每行之後的提示 –

回答

1

正如你已經發現,這是一個看似複雜的任務。這是因爲這裏有多個問題,包括C++庫和實際的底層文件。

C++庫

std::cin,和C++輸入流,使用中間緩衝液,std::streambuf。底層文件或交互式終端的輸入不是逐字符讀取,而是在可能的情況下以中等大小的塊進行讀取。比方說:

int n; 

std::cin >> n; 

比方說,如果這樣做,工作在,n包含數字42。那麼,什麼是真正的情況是,std::cin,更可能,沒看過只是兩個字,「4」和「2」,但無論其他字符,除此之外,都可以在std::cin流。其餘字符存儲在std::streambuf中,下一個輸入操作將在實際讀取底層文件之前讀取它們。

上述>>實際上沒有實際讀取文件中的任何內容,而是從std::streambuf中獲取在上一次輸入操作後留下的'4'和'2'字符。

可以檢查底層std::streambuf,並確定是否有任何未讀。但這並不能真正幫助你。

如果您正要執行上述>>運算符,您查看了底層的std::streambuf,發現它包含單個字符'4',這也告訴不了多少。您需要知道std::cin中的下一個字符。它可能是空格或換行符,在這種情況下,您從>>運算符得到的所有值爲4.或者,下一個字符可以是'2',在這種情況下,>>將吞下至少'42',並且可能更多數字。

您當然可以自己實現所有這些邏輯,查看底層的std::streambuf,並確定它是否會滿足即將到來的輸入操作。恭喜,您剛重新創建了>>運營商。你可能只是一次解析輸入,一個角色,你自己。

底層的文件

您確定std::cin沒有足夠的投入,以滿足你的下一個輸入操作。現在,您需要知道std::cin上的輸入是否可用。

這現在成爲操作系統特有的主題。這已不再由標準C++庫覆蓋。

結論

這是可行的,但在所有的實際情況,在這裏最好的解決辦法是使用一個操作系統特定的方法,而不是C++輸入流,並讀取和緩衝區你輸入你自己。例如,在Linux上,傳統方法是將fd 0設置爲非阻塞模式,以便read()不會阻塞,並確定是否有可用輸入,只需嘗試read()即可。如果你確實讀了一些東西,把它放到一個緩衝區中,稍後你可以看看。一旦你消耗了所有以前讀取的緩衝輸入,並且你真的需要等待更多的輸入被讀取,那麼文件描述符將被讀取,直到它到達那裏。