Martin
Martin

Reputation: 711

C++ filestream problem

I'm making a simple game in C++ and I want the highest score at the end of the game to be written in a text file. I'm using fstream to first read the last saved highscore and compare it to the new highscore. The output in the text file looks like this (0НН) and it shouldn't. I'm realy frustrated with this. Here's a part of my code.

double score_num=0;
fstream datafile("score.pon"); //Declaration of variables

...

if(SPEED>score_num)
{
     score_num=SPEED;
}
//getting the score

...

datafile<<score_num; //Writing it to the file

Upvotes: 0

Views: 834

Answers (3)

outis
outis

Reputation: 77400

My best guess as to why the original was failing is that when you read the last character from a file, the EOF bit is set. In this state, all read & write operations fail. You can write to a file stream that's reached its end by calling clear first.

// the following doesn't truncate file, or handle other error conditions.
if (datafile.eof()) {
    datafile.clear();
}
datafile.seekp(0, std::ios_base::beg);
datafile << score_num;

However, this won't solve all your problems. If you write less to the file than its current length (e.g. the old high score was "1.5" and the new high score is "2"), part of the old data will still be present at the end of the file. As long as scores never have a fractional part (in which case you should probably be using an integer type, such as unsigned long), you won't notice the bug, since a < b ⇒ len(a) ≤ len(b). To handle this properly, you'll need to use unapersson's recommended approaches (which will either truncate the file or always write the same amount of data to the file), or use a different I/O library (such as your platform's C library or boost) which provide a way to truncate files (such as the POSIX ftruncate).

Upvotes: 0

user2100815
user2100815

Reputation:

Hacky solution - open the file as an ifstream, read existing value, close it, adjust score, open file as an ofstream, write score, close it. Alternatively, investigate the use of the seekp() function, and write the score as a binary value, not as text.

Upvotes: 0

sehe
sehe

Reputation: 392931

#include <iostream>
#include <fstream>

using namespace std;
#define SPEED 12

int main()
{
    double score_num=0;
    ofstream datafile("score.pon"); //Declaration of variables


    if(SPEED>score_num)
    {
        score_num=SPEED;
    }
    //getting the score

    datafile<<score_num; //Writing it to the file
    return 0;
}

Replaced fstream by ofstream works like a charm. Perhaps you should show more code? Also, closing the file is good habit:

datafile.flush();
datafile.close();

I'll leave errorhandling to you

Upvotes: 3

Related Questions