Как не указывать больше ввода для строки ss в цикле while (cin >> ss) - PullRequest
12 голосов
/ 19 марта 2011

Я использовал «cin» для чтения слов из входного потока, например

int main( ){
     string word;
     while (cin >> word){
         //do sth on the input word
     }

    // perform some other operations
}

Структура кода похожа на приведенную выше.Это компилируется.Во время выполнения я продолжаю вводить что-то вроде

aa bb cc dd

Мой вопрос: как закончить этот ввод?Другими словами, предположим, что текстовый файл просто "aa bb cc dd".Но я не знаю, как сообщить программе, что файл заканчивается.

Ответы [ 10 ]

18 голосов
/ 19 марта 2011

Ваш код правильный.Если бы вы вводили в интерактивном режиме, вам нужно было бы отправить символ EOF, такой как CTRL-D.

Этот символ EOF не нужен, когда вы читаете файл.Это потому, что как только вы достигнете конца входного потока, «cin» больше ничего не останется (потому что поток теперь закрыт), поэтому цикл while завершается.

5 голосов
/ 19 марта 2011

Поскольку другие уже отвечают на этот вопрос, я хотел бы добавить следующее важное замечание:

Поскольку Ctrl-Z в Windows (и Ctrl-D в Unix-системах) приводит к достижению EOF, и вы выходите из while, но вне цикла while вы не можете прочитать дальнейшие входные данные, так как EOF уже достигнут.

Таким образом, чтобы снова включить чтение с использованием cin, необходимо сбросить флаг eof и все остальные флаги отказа, как показано ниже:

cin.clear();

После этого вы можетеначните читать ввод, используя cin еще раз!

3 голосов
/ 19 марта 2011
int main() {
     string word;
     while (cin >> word) {
         // do something on the input word.
         if (foo)
           break;
     }
    // perform some other operations.
}
1 голос
/ 19 марта 2011

cin >> some_variable_or_manipulator всегда будет соответствовать ссылке на cin.Если вы хотите проверить и посмотреть, есть ли еще входные данные для чтения, вам нужно сделать что-то вроде этого:

int main( ){
     string word;
     while (cin.good()){
         cin >> word;
         //do sth on the input word
     }

    // perform some other operations
}

Это проверяет добрый бит потока, который установлен в true, когда ни один из eofbit, failbitили бадбит установлены.Если при чтении произошла ошибка или поток получил символ EOF (от достижения конца файла или от пользователя с клавиатуры, нажав CTRL + D), cin.good () вернет false и выведет вас изцикл.

1 голос
/ 19 марта 2011

Нажмите Ctrl-Z (Ctrl-D в * nix системах) и нажмите Enter.Это отправляет EOF и делает поток недействительным.

0 голосов
/ 20 февраля 2017

Вы можете проверить наличие специального слова при вводе.Например, "стоп":

int main( ){
   string word;

   while (cin >> word){
      if(word == "stop")
          break;

      //do sth on the input word
   }

// perform some other operations
}
0 голосов
/ 08 сентября 2016

ваша программа не учитывает пробелы.сделать разницу между cin и getline ...

вот пример с уловкой: программа получает ввод и печатает вывод, пока вы не нажмете дважды Enter, чтобы выйти:

#include <iostream>
#include <string>
using namespace std;

int main(){


    char c = '\0';
    string word;
    int nReturn = 0;

    cout << "Hit Enter twice to quit\n\n";

    while (cin.peek())
    {
        cin.get(c);

        if(nReturn > 1)
            break;
        if('\n' == c)
            nReturn++;
        else
            nReturn = 0;
        word += c;
        cout << word;
        word = "";
    }

    cout << endl;
    return 0;
}
0 голосов
/ 19 апреля 2016

Это помогает мне завершить цикл, нажав ENTER.

int main() {
    string word;
    while(getline(cin,word) && s.compare("\0") != 0) {
        //do sth on the input word
    }

    // perform some other operations
}
0 голосов
/ 10 июля 2014

Возьмите ввод из файла. Затем вы обнаружите, что цикл while завершается, когда ваша программа перестает принимать ввод. На самом деле cin перестает принимать данные, когда находит маркер EOF. Каждый входной файл заканчивается этим маркером EOF. Когда этот маркер EOF обнаружен operator>>, он изменяет значение внутреннего флага eofbit на false и, следовательно, цикл while останавливается.

0 голосов
/ 19 марта 2011

Полагаю, вы хотите выпрыгнуть в конце файла. Вы можете получить значение basic_ios :: eof , оно возвращает true в конце потока.

...