2012-04-29 2 views
1

Я читал текст на C++ по адресу: http://www.parashift.com/c++-faq-lite/new/istream-and-while.html.Почему while (std :: cin >> foo) синтаксис не работает?

Согласно тексту, я написал этот код:

int sum = 0, value; 
while(cin >> value) 
{ 
    cout << "value: " << value << endl; 
    sum += value; 
} 
cout << "sum: " << sum << endl; 

Если вход был: 1 2 3 4 5

Затем цикл, пока не остановится, как я ожидал. Я что-то не понимаю? (Я использовал MS Visual C++ 2005)

ответ

6

Ваш цикл while будет считывать ввод до тех пор, пока входной поток не будет закрыт. В консоли Windows это означает, что пользователь нажимает Ctrl + Z.

Если вы хотите прочитать ввод до тех пор, пока пользователь не нажимает, вам нужно сделать что-то по-другому. Например, вы можете прочитать всю строку с помощью getline, а затем поместить эту строку в строковый поток и прочитать из этого в цикле while - или вы можете использовать метод peek() класса istream после прочтения каждого значения, чтобы проверить, будет ли следующий символ в потоке есть новая строка.

-1

Вам не нужен цикл while. cin >> value только один раз.

+3

В то время как это работает, оно значительно меняет смысл программы (и делает ненужными другие части исходного кода). – delnan

0

Вы можете установить специальное значение для выхода из цикла.

Например:

int sum = 0, value = 0; 
while(value != -199) 
{ 
    cin >> value 
    if(value != -199) { 
    cout << "value: " << value << endl; 
    sum += value; 
    } 
} 
cout << "sum: " << sum << endl; 

Этот цикл будет выходить только если нажать -199 (не обязательно -199, я выбрал его, потому что это тривиальная для большинства программ). Это может быть 0 или -1, если вы не будете использовать их в качестве входных данных.

0

В консоли Windows, что не означает, что до тех пор, как пользователь нажмет Ctrl + Z

Замечу, что это не обязательно истинной, в отношении топ-ответ.

Оператор ввода будет оставаться неопределенно долго, пока активен в цикле, пока она не станет недостоверной или ложного. По своей природе он хочет взять пользовательский ввод для целого числа . Учитывая ваш пример, вы должны ввести любое нецелое число, чтобы он оценил значение false.