D
david.crow
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<int> grades;
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<Student> students;
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<int> grades;
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?
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<int> grades;
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<Student> students;
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<int> grades;
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?