Подтвердить что ты не робот

Как не указывать больше ввода для строки 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". Но я не знаю, как сообщить программе, что файл заканчивается.

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

cin.clear();

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

Ответ 4

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

Ответ 5

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 и выбьет вас из цикл.

Ответ 6

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

Ответ 7

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

Ответ 8

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

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

    // perform some other operations
}

Ответ 9

Вы можете сделать чек для ввода специального слова. F.E. "Стоп":

int main( ){
   string word;

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

      //do sth on the input word
   }

// perform some other operations
}

Ответ 10

ваша программа не учитывает пробелы. сделать разницу между 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;
}