2012-06-19 2 views
2

Код ниже предназначен для хранения группы слов в std::vector и для подсчета количества раз, когда определенное слово, заданное пользователем, появляется в векторе, сравнивая его со всеми словами, хранящимися в вектор.Повторное использование std :: cin after EOF

Консоль не запрашивает меня для ввода на втором std::cin >> в программе ниже.

#include <iostream> 
#include <ios> 
#include <iomanip> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main(int argc, const char * argv[]) 
{ 
    cout<<"enter your words followed ny EOF"<<endl; 
    vector<string> words; 
    string x; 
    typedef vector<string>::size_type vec_size; 
    vec_size size; 
    while (cin>>x) 
    { 
    words.push_back(x); 
    } 
    size=words.size(); 
    cin.clear(); 

    //now compare 
    cout<<"enter your word:"<<endl; 
    string my_word; 
    int count=0; 

    cin>>my_word;    //didn't get any prompt in the console for this 'cin' 
    for (vec_size i=0; i<size; ++i) 
    { 
     my_word==words[i]?(++count):(count=count); 
    } 
    cout<<"Your word appeared "<<count<<" times"<<endl; 
    return 0; 

} 

Конечный результат, который я получаю, это «Ваше слово появилось 0 раз». В чем проблема с кодом. Любая помощь будет большой.

+0

как вы входите в EOF? –

+0

контроль + d для mac osx. Не знаю, для окон – tez

ответ

1

Программа считывает список слов до конца файла. Итак, на терминале вы можете ввести символ EOF (Ctrl-D на Linux, Ctrl-Z на Windows), но что тогда?

Я думаю, что после сброса потока терминал будет продолжать читать. Но если программа принимает входные данные из файла диска, трубы и т. Д., Нет никакой надежды. Конец файла навсегда.

Вместо этого используйте какой-либо дозорный сигнал или префикс его счетчиком. Таким образом, первый цикл может работать до логического конца списка. И тогда он может прочитать слово, предназначенное для сводной логики.

while (cin>>x && x != '*') // The word "*" ends the list of words 
    { 
    words.push_back(x); 
    } 
    size=words.size(); 

    //now compare 
    cout<<"enter your word:"<<endl; 
+0

Wow.It работал.Awesome.But я не совсем понимаю часть «Я думаю, после сброса потока, терминал будет продолжать читать. Но если программа принимает входные данные из файла диска, трубы и т. Д., Есть нет никакой надежды. Конец файла навсегда ». Любая помощь в этом plzz? – tez

+4

Это зависит от реализации' filebuf', но я думаю, что целью EOF является навсегда, даже на терминале. (Оба g ++ и Windows действительно обрабатывают EOF как всегда, даже с терминала. Но это не всегда так.) Интересно, что это файл, где он не навсегда, если вы очиститесь и начнете поиск, вы можете перечитать файл . (Повторная запись на клавиатуре требует большого сотрудничества со стороны машинистки). –

2
while (cin>>x) 
{ 
    words.push_back(x); 
} 

Здесь вы читаете до отказа. Итак, когда этот цикл завершается, cin находится в состоянии ошибки. Вам нужно очистить состояние ошибки:

cin.clear(); 
+1

Извините, я забыл упомянуть. Я тоже так думал, и я использовал cin.clear() после цикла (отредактировал код). Но это не сработало :(тоже – tez