By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,132 Members | 1,999 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,132 IT Pros & Developers. It's quick & easy.

Differences in reading from an istream vs. stringstream

P: n/a
Given the following input file:

bob 1 2 3 4 5
mary 2 3 4 5 6 7
susan 3 4 5 6 7 8 9

This code snippet does not read it correctly:

class Student
{
public:
...
private:
std::string _Name;
std::vector<int_Grades;
};
....
/***** this only gets called once *****/
std::istream& operator>>(std::istream& is, Student& s)
{
string name = "";
is >name;
std::vector<intgrades;
std::copy(std::istream_iterator<int>(is),
std::istream_iterator<int>(), std::back_inserter(grades));
/***** at this point, name and the grades vector are correct for
the 'first' line in the input file *****/
s.setName(name);
s.setGrades(grades);
return is;
}
....
std::ifstream fin;
std::vector<Studentstudents;
std::copy(std::istream_iterator<Student>(fin),
std::istream_iterator<Student>(), std::back_inserter(students));
/***** at this point, the students vector is empty *****/

If I change operator>to read from a stringstream instead, it works
as expected.

std::istream& operator>>(std::istream& is, Student& s)
{
std::string name = "";
is >name;

std::string sGrades = "";
std::getline(is, sGrades);

std::stringstream ss(sGrades);

std::vector<intgrades;
std::copy(std::istream_iterator<int>(ss),
std::istream_iterator<int>(), std::back_inserter(grades));

s.setName(name);
s.setGrades(grades);

return is;
}

So even though the one (and only) call to operator>read the first
line of the file and assigned the values to the Student parameter, the
students vector got nothing added to it. Why would changing to a
stringstream fix this?

Jun 1 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
<da********@pbsnow.comwrote in message
news:11********************@m36g2000hse.googlegrou ps.com...
Given the following input file:

bob 1 2 3 4 5
mary 2 3 4 5 6 7
susan 3 4 5 6 7 8 9

This code snippet does not read it correctly:

class Student
{
public:
...
private:
std::string _Name;
std::vector<int_Grades;
};
...
/***** this only gets called once *****/
std::istream& operator>>(std::istream& is, Student& s)
{
string name = "";
is >name;
std::vector<intgrades;
std::copy(std::istream_iterator<int>(is),
std::istream_iterator<int>(), std::back_inserter(grades));
And what happens after the "5" in the first line is read? It will attempt
to read "mary" and "mary" is not an integer. Puts is into an error state.
/***** at this point, name and the grades vector are correct for
the 'first' line in the input file *****/
s.setName(name);
s.setGrades(grades);
return is;
}
...
std::ifstream fin;
std::vector<Studentstudents;
std::copy(std::istream_iterator<Student>(fin),
std::istream_iterator<Student>(), std::back_inserter(students));
/***** at this point, the students vector is empty *****/

If I change operator>to read from a stringstream instead, it works
as expected.

std::istream& operator>>(std::istream& is, Student& s)
{
std::string name = "";
is >name;

std::string sGrades = "";
std::getline(is, sGrades);
Yes, here you are reading one line which stops at the end of line. So for
the first line sGrades will contain "1 2 3 4 5".
std::stringstream ss(sGrades);

std::vector<intgrades;
std::copy(std::istream_iterator<int>(ss),
std::istream_iterator<int>(), std::back_inserter(grades));

s.setName(name);
s.setGrades(grades);

return is;
}

So even though the one (and only) call to operator>read the first
line of the file and assigned the values to the Student parameter, the
students vector got nothing added to it. Why would changing to a
stringstream fix this?
As indicated. std::copy is attempting to read the rest of the entire file,
names included. std::getline is attempting to read the rest of the line, no
names included since it stops at the end of line terminator.
Jun 1 '07 #2

P: n/a
On Jun 1, 11:21 am, "Jim Langston" <tazmas...@rocketmail.comwrote:
>
As indicated. std::copy is attempting to read the rest of the entire file,
names included. std::getline is attempting to read the rest of the line, no
names included since it stops at the end of line terminator.- Hide quoted text -
Thanks for the clarification, Jim.

Jun 1 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.