4

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...

ThinkingStiff
  • 64,767
  • 30
  • 146
  • 239
Cosmin
  • 75
  • 1
  • 6

2 Answers2

10

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
  • 476,176
  • 80
  • 629
  • 1,111
4

Jerry Coffin is right about the line endings.

However, you don't have to use stringstream to read the entire file correctly. You just have to open it as binary by using std::ios::binary in std::ifstream constructor.

dotsquid
  • 73
  • 4