2

これは現在の私のコードです。このコードは、cin.get() でエラーを発生させます。私はそれが良いコードではないことを理解しています.それは決して良いコードではありませんでした.私は単にいくつかのcinのものをテストしていました.

#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」です。これを char 配列にロードし、cout を使用して出力しました。認識できない記号の長い文字列が出力されます (これらはそれぞれ個別の記号です)。

http://gyazo.com/e3ee65cdad7ed5cc7b2ce2307ca58c90

整数にキャストすると、これらは -52 として出力されます。これは、ASCII または Unicode のいずれにも相当しません。

Visual C++ Express 2010 を使用してコンパイルしています。

助けてください、私はこの時点で完全に困惑しています。何もない場合は一時停止せずに、単に文字を読み取り/ストリームをフラッシュしたいだけです。これを解決するのに3時間も費やしました。はぁ。

4

1 に答える 1

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 システムで何が必要かはわかりません。

于 2012-11-12T22:00:01.170 に答える