Eric Lilja <mindcoo...@gmail.com> wrote in message...
On 15 Juli, 16:18, Eric Lilja <mindcoo...@gmail.com> wrote:
On 15 Juli, 15:12, Robert Bauck Hamar <roberth+n...@ifi.uio.no> wrote:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct s_t{
s_t() {}
s_t(const string& si, int xi, int yi) : s(si), x(xi), y(yi) {}
string s;
int x, y;
friend ostream& operator<<(ostream& os, const s_t& rhs);
friend istream& operator>>(istream& is, s_t& rhs);
};
ostream& operator<<(ostream& os, const s_t& rhs){
os << rhs.s << endl;
os << rhs.x << ' ' << rhs.y;
return os;
}
istream& operator>>(istream& is, s_t& rhs){
getline(is, rhs.s);
is >> rhs.x >> rhs.y;
return is;
}
void readit(){
int x = 0, y = 0;
vector<s_t> vec;
ifstream in("foo.txt");
in >> x >> y;
After this, the next character in the input stream should be a '\n'.
{
s_t temp;
This will now read to the first newline in the stream and put the
result
into temp.s. Since the first character is a newline, temp.s will be
empty.
Then in will try to put the contents of what's stored as a string into
temp.x. In this case, in finds 'f', and fails. Thus the reading of the
two
ints will become a noop, and the test fails.
I suggest you look up the ignore() member function of istream. You
need to
ignore the rest of the line.
I solved it by adding this to my overloaded operator>>:
if (is.peek() == '\n'){ is.ignore();}
before the getline() call. Now that program works just fine. However,
the *real* program tries to read even though there are no more entries
in the file. Hmm.
And I solved that by checking the return value of the getline() call
and returning the stream directly if it fails.
while (in >> temp) vec.push_back(temp);
}
in.close();
cout << x << ' ' << y << endl;
cout << vec.size() << endl;
for (unsigned int i = 0; i < vec.size(); i++)
cout << vec.at(i) << endl;
}
int main(){
int x = 4711, y = 1337;
vector<s_t> vec;
vec.push_back(s_t("foo bar", 33, 22));
vec.push_back(s_t("bar baz", 11, 99));
ofstream out("foo.txt");
out << x << ' ' << y << endl;
for (unsigned int i = 0; i < vec.size(); i++){
out << vec.at(i);
if (i < vec.size() - 1)
out << endl;
}
out.flush();
out.close();
readit();
}
Your 'vector' in 'main()' is separate from the 'vector' in 'readit()'. If
you want to fill a 'vector' from 'main()', try adding this (no need to
remove your current version):
void readit( std::vector<s_t> &vec ){ // non-const
ifstream in("foo.txt");
if( not in.is_open() ){ std::cerr<<"ERROR"; return; }
int x( 0 ), y( 0 );
in >> x >> y;
if( in.peek() == '\n' ){ in.ignore(); }
s_t temp;
while( in >> temp ) vec.push_back( temp );
// untested. replace the above two lines with:
// for( s_t temp; in >> temp; /*m_t*/ ){
// vec.push_back( temp );
// } // for(in)
} // readit( std::vector<s_t>&)
{ // main
// .....
std::vector<s_t> vst;
readit( vst );
for( std::size_t i(0); i < vst.size(); ++i )
cout << vst.at(i) << endl;
}
reading problem. I don't care in this program if I use different
vectors, it's completely irrelevant. And I know perfectly well what