1

ここでの根本的な問題であると思われる作品がどのように機能するかはよくわかりません。while(cin>>x) に関する以前の投稿をいくつか読んだことがありますが、私の質問に実際に答えているものは何もないようです。このループを使用して、テキスト データを読み取ります。

while (cin >> x){
    searchText.push_back(x);
}

しかし、コードの後半で、次を使用して単一の単語を読み取ろうとしています。

cout << "Please enter your target word: ";
string targetWord;
cin >> targetWord;

しかし、上記のwhile loop/eofは2番目のコードスニペットを台無しにするようです(2番目のコードスニペットを上に移動すると、すべて正常に動作しますが、明らかにそれは私がやろうとしていることではありません)

編集 明確にするために完全なコードを次に示します。

int main()
{
// ask for the target word
//   cout << "Please enter your target word: ";
//   string targetWord;
//   cin >> targetWord;

   // ask for and read the search text
   cout <<  "Enter the complete search text, "
            "followed by end-of-file: ";
   vector<string> searchText;
   string x;
   while (cin >> x){
      searchText.push_back(x);
   }

   // check that some text was entered
   typedef vector<string>::size_type vec_sz;
   vec_sz size = searchText.size();
   if (size == 0){
      cout << endl <<   "You must enter some text. "
                        "Please try again." << endl;
      return 1;
   }

// ask for the target word
   cin.clear();
   cout << "";
   cout << "Please enter your target word: ";
   string targetWord;
   cin >> targetWord;


   int count = 0;
   for (int i=0; i<size; ++i){
      if (targetWord == searchText[i]){
      count++;
      }
   }

   cout  << "The target word [" << targetWord << "] was "
            "in the search text " << count << " times." << endl;

   return 0;
}

ユーザーからテキストを取り込もうとしています...次に検索単語を入力し、入力されたテキストにその単語が何回出現するかを確認します(非常に簡単です!)

別の方法で実行できることはわかっていますが、ここでの質問は、以前に EOF が含まれていた後に cout/cin ストリームを再度使用する方法についてです。

4

5 に答える 5

2

実行がループを離れるとき

while (cin >> x){
    searchText.push_back(x);
}

これは、の「テスト」がcinfalse を返した、つまり、failbitストリームbadbitに設定されているためです。その場合、ストリームから読み取ろうとすると失敗します。つまり、targetWord空のままになります。

ストリームを再び使用できるようにするには、次を呼び出してエラー フラグをリセットする必要があります。cin.clear();

于 2013-07-01T12:27:30.500 に答える
2

最初のループでの型を知っていればいくらかは役に立ちますxが、基本的には、利用可能なすべての入力を読み込んでから、さらに読み込もうとすると、失敗していることに驚くことになります。逆に私は驚くだろう。

本当の問題は、何をしようとしているのかということです。基本的に、 の型は何ですか? また、プロンプトから対話型デバイスxであると想定していると思いcinますが、最初の入力が終了したことをどのように判断しますか? 最初のループが「ファイルの終わり」 (ユーザーが Unix では control-D、Windows では control-Z を入力した) のために終了した場合、確実に続きを読むことを期待できる方法はありません。エラーステータスをリセットするとうまくいくcin.clear() かもしれません。これにより、 はistreamからさらに読み取ろうとしますstreambuf。しかし、そうではないかもしれません。istream その下には、何らかの理由でファイルの終わりを記憶している可能性のあるレイヤーがいくつもあります。そのため、終わりを認識する別の方法を見つける必要があります。

変数の名前から推測するだけです。単語のリストを読み込もうとしている場合はstd::getline、リストの最後に空の行を付けて を使用します。したがって、最初のループは次のようになります。

while ( std::getline( std::cin, x ) && x != "" ) {
    searchText.push_back( x );
}
if ( ! std::cin ) {
    //  Something really bad has happened...
}

別の方法として、空白で行を分割して、1 行に複数の単語を許可することもできます (また、行内の余分な空白を無視するには:

std::string line;
while ( std::getline( std::cin, x ) && x != "" ) {
    std::istringstream l( line );
    while ( l >> x ) {
        searchText.push_back( x );
    }
}
if ( ! std::cin ) //  ...

他のタイプがある場合でも、xこれらの線に沿って何かを検討したい場合があります。

于 2013-07-01T13:50:39.297 に答える
0

cin.clear() を使用しましたが、Mac セットアップでは EOF をクリアしていないように見えましたが、ubuntu セットアップではストリームをクリアしました

アップル:

(Canopy 32bit) joes-imac:chap3 joe$ g++ --version
i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)

Ubuntu:

joe@joe-HPlaptop:~$ g++ --version
g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
Copyright (C) 2011 Free Software Foundation, Inc.

私はそれが単なるコンパイラの違いであることを受け入れ、問題を終了/クローズします (本当にばかげた小さな問題でした!)

しかし、すべての助けに感謝します(実際に私の最初のスタックオーバーフローの質問です!)

于 2013-07-01T17:08:48.560 に答える