Как обозначить отсутствие ввода для строки ss в цикле while (cin> ss)

я использовал "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 ответов


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

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


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

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

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

cin.clear();

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


int main() {
     string word;
     while (cin >> word) {
         // do something on the input word.
         if (foo)
           break;
     }
    // perform some other operations.
}

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


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
}

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


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


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


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

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

    // perform some other operations
}

вы можете сделать проверку для специального слова во входных данных. Ф. Е. "стоп":

int main( ){
   string word;

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

      //do sth on the input word
   }

// perform some other operations
}

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

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

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

int main(){


    char c = '';
    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;
}