tags:

views:

75

answers:

1

Why does this fail, it's supposed to be simple and work ?

fisier.seekg(0, ios::end);
long lungime = fisier.tellg();

This returns a larger value than that of the file resulting in a wrong

char *continut = new char[lungime];

Any idea what the problem could be ?

I also tried counting to the end of the file one char at a time, that rendered the same result, a higher number than expected. But upon using getline() to read one line at a time, it works, there are no extra spaces...

Thank you

+4  A: 

At a guess, you're opening the file in translated mode, probably under Windows. When you simply seek to the end of the file, the current position doesn't take the line-end translations into account. The end of a line (in the external file) is marked with the pair "\r\n" -- but when you read it in, that's converted to just a "\n". When you use getline to read one line at a time, the \ns all get discarded as well, so even on a system (e.g. Unix/Linux) that does no translation from external to internal representation, you can still expect those to give different sizes.

Then again, you should really forget that new [] exists at all. If you want to read an entire file into a string, try something like this:

std::stringstream continut;
continut << fisier.rdbuf();

continut.str() is then an std::string containing the data from the file.

Jerry Coffin
Nice! I always wondered if there was an easy way to drain a std::stream.
Simon Buchan
@Jerry Coffin: Bill replaces all calls to his `LoadFileAsString` function out of pure embarrassment...
Billy ONeal
@Billy: it is pretty slick isn't it? It really deserves to be better known...
Jerry Coffin