«Отключен одной ошибкой» при использовании istringstream в C ++ - PullRequest
4 голосов
/ 24 января 2012

Я получаю отключение одной ошибкой при выполнении следующего кода

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

int main (int argc, char* argv[]){
    string tokens,input;
    input = "how are you";
    istringstream iss (input , istringstream::in);
    while(iss){
        iss >> tokens;
        cout << tokens << endl;
    }
    return 0;

}

Он дважды выводит последний токен "вы", однако, если я внесу следующие изменения, все будет нормально.

 while(iss >> tokens){
    cout << tokens << endl;
}

Может кто-нибудь объяснить мне, как работает цикл while. Спасибо

1 Ответ

9 голосов
/ 24 января 2012

Это правильно.Условие while(iss) не выполняется только после прочтения после окончания потока .Итак, после того, как вы извлекли "you" из вашего потока, все равно это будет верно.

while(iss) { // true, because the last extraction was successful

Итак, вы пытаетесь извлечь больше.Это извлечение не выполняется, но не влияет на значение, хранящееся в tokens, поэтому оно печатается снова.

iss >> tokens; // end of stream, so this fails, but tokens sill contains
               // the value from the previous iteration of the loop
cout << tokens << endl; // previous value is printed again

По этой самой причине вам всегда следует использовать второй подход, который вы показываете.При таком подходе цикл не будет введен, если чтение было неудачным.

...