Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How can I correctly keep track of stream position?

I am writing a program which requires me to take in double inputs from the user in a very specific way, so I’m learning about streams.

In the end, my goal is to force the user to format their input in the way I desire, which is:

2.0 3.0 4.0 -> doubles (or integers) with spaces in between and no trailing spaces

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I’ve been using a std::istringstream to read inputs in a way akin to the following example:

#include <iostream>
#include <sstream>
using namespace std;

int main(){
    int a[5] = {0};
    
    while (1){
        cout << "Input: ";
        string s;
        getline(cin, s);
        istringstream buffer(s);
        
        for (int i = 0 ; i < 5 ; i++)
            buffer >> a[i];
        
        for (int i = 0 ; i < 5 ; i++)
            cout << a[i] << " ";
        cout << endl;
    }
}

My question is about the following terminal input/output:

Input: 1 2 3 4 5
1 2 3 4 5 
Input: a b c d e
0 2 3 4 5 

Why is the output for the characters being put into integers the way it is?

Here is another example:

Input: 5 6 7 8 9
5 6 7 8 9 
Input: a b c d e
0 6 7 8 9 

It seems to be defaulting to 0 for the first encountered character, and then reusing the rest of the stream, which is why I’m asking about stream position.

My expectations:

  1. Either it would be the corresponding ASCII numerals.

  2. They would all be 0, since (for a reason that I would like to know), characters inputted from a stream into an integer tend to default to 0.

I believe the output being the way it is has to do with the stream position, and I would like it explained (along with an answer on the defaulting 0 characters).

Basically, I’m curious about streams and would like to know more about how they’re handled, and this seems like a quirk that could highlight that.

>Solution :

Here’s the full explanation for your output.

I’m concentrating on the input of a.

First action is that cin >> a[i]; sets a[i] to zero.

Second action is that the read fails because a is not a valid integer. This puts the cin stream into an error state.

Third action is that cin >> a[i]; returns and the programs prints the value from step one.

Now the stream is in an error state (from step two) all subsequent reads fail, with no change to any a[i] so the previous values are printed.

So nothing to do with stream position.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading