M.Ruiz
M.Ruiz

Reputation: 1

Ifstream in c++

I need some help with a code.

I need to take this information to my c++ code from another file, the last one is just like this:

Human:3137161264 46

This is what I wrote for it, it takes the word "Human" correctly but then it takes random numbers, not the ones written on the file I just wrote:

struct TSpecie {
string id;
int sizeGen;
int numCs; };

__

TSpecie readFile(string file){
TSpecie a;
ifstream in(file);
if (in){
    getline(in,a.id,':');
    in >> a.sizeGen;
    in >> a.numCs;
}
else
    cout << "File not found";
return a; }

Hope you can solve it and thanks for your help

Upvotes: 0

Views: 119

Answers (2)

Dietmar K&#252;hl
Dietmar K&#252;hl

Reputation: 154035

Always test whether input was successful after reading from the stream:

if (std::getline(in, a.id, ':') >> a.sizeGen >> a.NumCs) {
   // ...
}

Most likely the input just failed. For example, the first number probably can't be read successful. Also note that std::getline() is an unformatted input function, i.e., it won't skip leading whitespace. For example the newline after the last number read is still in the stream (at least, since your use of std::getline() finishes on a colon, it will only create an odd ID).

Upvotes: 1

Yuriy Ivaskevych
Yuriy Ivaskevych

Reputation: 966

3137161264 causes integer overflow leading to Undefined Behaviour.

So unsigned int sizeGen would be enough for this case, but consider long long (unsigned) int sizeGen too.

Edit 1: As pointed out by @nwp in comments to your question, you can also check your stream if any error has occured:

//read something and then 

if (!in) { 
    // error occured during last reading 
}

Upvotes: 2

Related Questions