Проблема с файловым потоком в C ++ - PullRequest
0 голосов
/ 24 апреля 2011

Я делаю простую игру на C ++ и хочу, чтобы в конце игры был записан самый высокий результат в текстовом файле.Я использую fstream, чтобы сначала прочитать последний сохраненный рекорд и сравнить его с новым рекордом.Вывод в текстовом файле выглядит так (0НН), и не должен.Я действительно расстроен этим.Вот часть моего кода.

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

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011
#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;
}

Замененный fstream на ofstream работает как шарм.Возможно, вам следует показать больше кода?Кроме того, закрывать файл - это хорошая привычка:

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

Я оставлю вам обработку ошибок

0 голосов
/ 25 апреля 2011

Мое лучшее предположение о том, почему оригинал не удался, заключается в том, что когда вы читаете последний символ из файла, устанавливается бит EOF .В этом состоянии все операции чтения и записи не выполняются.Вы можете записать в поток файлов, который достиг своего конца, сначала вызвав clear.

// 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;

Однако это не решит всех ваших проблем.Если вы записываете в файл меньше, чем его текущая длина (например, старый высокий балл был «1,5», а новый высокий балл - «2»), часть старых данных все равно будет присутствовать в конце файла.Пока оценки никогда не имеют дробной части (в этом случае вы, вероятно, должны использовать целочисленный тип, такой как unsigned long), вы не заметите ошибку, так как a ftruncate).

0 голосов
/ 24 апреля 2011

Hacky решение - открыть файл как ifstream, прочитать существующее значение, закрыть его, настроить счет, открыть файл как ofstream, написать счет, закрыть его. В качестве альтернативы изучите использование функции seekp () и запишите оценку в виде двоичного значения, а не текста.

...