2017-01-22 21 views
2

私は別の解決策を見つけることにもっと興味があるので、タイトルは間違いです。私の直感は、バッファが空であるかどうかをチェックすることが(少なくとも私の場合は)最も理想的な解決策ではないということです。C++ std :: cinバッファが空であるかどうかをチェックする方法

私はC++を新しくしており、Bjarne StroustrupのC++を使用したプログラミングの原則と実践に従っています。私は現在第7章にあり、第6章から電卓を「改良」しています。質問の最後にソースコードのリンクを入れます。

基本的に、電卓は複数セミコロンで区切られたユーザーからの入力

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

しかし、私は、最後の2つの答えのプロンプト文字(「>」)を取り除くために好​​きで、ユーザーの入力がを求められた場合にのみ、再びそれを表示したいです。私の最初の本能は、バッファが空であるかどうかを調べる方法を見つけ出すことでした。もしそうなら、文字を取り、そうでなければ、答えを返すようにしてください。しかし、少しのグーグル・グーグルでは、当初考えていたほど簡単ではないことがわかった。そして、それはあまり良いことではないかもしれない。

私は本質的に私の質問は、複数の入力がある場合、最後の2つの答えの '>'文字を取り除く方法です。しかし、cinバッファーを確認することが可能であり、が可能であり、ではない結局のところ、私はそれを行う方法を知りたいです。

ソースコード:https://gist.github.com/Spicy-Pumpkin/4187856492ccca1a24eaa741d7417675

ヘッダファイル:http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h

^あなたはこのヘッダファイルが必要です。私はそれが作者自身によって書かれたと仮定します。

編集:私はいくつかの解決方法についてウェブを見てきましたが、正直言って私には意味がありませんでした。私はC++を拾ってから4日ほど経ちましたが、プログラミングの背景が非常に薄いため、時にはグーグルでもちょっと難しいです。

+1

スティックで突き刺して、うずきがあるかどうかを確認します。 –

+1

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

+0

この場合、 'std :: getline'を使って一度に1行ずつ読むことができます。各行の後にプロンプ​​トが表示されます –

答えて

1

発見したように、これは非常に複雑な作業です。これは、C++ライブラリと実際の基礎となるファイルの両方で、複数の問題が発生しているためです。

C++ライブラリ

std::cin、及びC++入力ストリーム、中間バッファ、std::streambufを使用します。基礎となるファイルまたは対話型端末からの入力は、文字単位ではなく、可能であれば適度なサイズの塊で読み込まれます。さんが言ってみましょう:

int n; 

std::cin >> n; 

だが、これが行われ、上にあるときに、nは数42が含まれていることを言ってみましょう。実際には、std::cinは「4」と「2」の2文字しか読み込まれませんでしたが、それ以外の文字はstd::cinストリームで利用できました。残りの文字はstd::streambufに格納され、次の入力操作で実際に元のファイルを読み取る前にそれらの文字が読み込まれます。

また、上記の>>は実際にはファイルから何も読み取らず、前の入力操作後に残っていたstd::streambufの '4'と '2'文字を取り込んでいる可能性があります。

基礎となるstd::streambufを調べて、そこに未読のものがあるかどうかを判断することは可能です。しかし、これは本当にあなたを助けるものではありません。

上記の>>演算子を実行しようとしていた場合、基礎となるstd::streambufを見て、その文字に「4」の文字が1つ含まれていることがわかります。あなたは次の文字が何であるかを知る必要がありますstd::cin。スペースや改行でもかまいません。この場合、>>演算子から得られるものはすべて4です。次の文字は '2'になる可能性があります。この場合、>>は少なくとも「42」を飲み込みます数字。

あなたは確かにこの論理をすべて実装し、基礎となるstd::streambufを見て、今後の入力操作を満たすかどうかを判断できます。おめでとうございます。ちょうど>>オペレータを改革しました。一度に1文字ずつ入力を解析することもできます。

あなたはstd::cinがあなたの次の入力操作を満たすのに十分な入力を持っていないと判断

基礎となるファイル。さて、入力が利用可能かどうかは、std::cinで知る必要があります。

これはオペレーティングシステム固有の主題になりました。これはもはや標準のC++ライブラリではカバーされません。

結論

これはなんとかですが、すべての実用的な状況では、ここに最善の解決策ではなく、C++入力ストリームで、オペレーティング・システム固有のアプローチを使用して、自分自身を読んで、あなたの入力をバッファリングすることです。例えば、Linuxでは、fd 0を非ブロックモードに設定して、read()がブロックされないようにし、利用可能な入力があるかどうかを判断するには、read()を試してください。もしあなたが何かを読んだら、後で見ることができるバッファに入れてください。以前に読み込まれたすべてのバッファリングされた入力を消費した後、本当に入力が読み込まれるまで待つ必要があります。poll()ファイルディスクリプタが存在するまで待ちます。

関連する問題