2012-01-24 2 views
4

я получаю прочь от одной ошибки при выполнении следующего кода«Off одной ошибки» при использовании istringstream в C++

#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. Спасибо

ответ

9

Это правильно. Условие 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 

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

Смежные вопросы