Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Off by one error" while using istringstream in C++

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

like image 612
shiraz Avatar asked Jan 17 '23 17:01

shiraz


1 Answers

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.

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

So you try to extract more. This extraction fails, but does not affect the value stored in tokens, so it is printed again.

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

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.

like image 128
Björn Pollex Avatar answered Jan 27 '23 10:01

Björn Pollex