I get an off by one error while executing the following code
#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;
}
It prints out the last token "you" twice, However if I make the following changes everything works fine.
while(iss >> tokens){
cout << tokens << endl;
}
Can anyone explain me how is the while loop operating. Thanks
That is correct. The condition
while(iss)
fails only after you read past the end of the stream. So, after you have extracted"you"
from your stream, it will still be true.So you try to extract more. This extraction fails, but does not affect the value stored in
tokens
, so it is printed again.For this very reason, you should always use the second approach you show. In that approach, the loop will not be entered, if the read was unsuccessful.