Использование файлового потока для реализации высоких результатов - PullRequest
0 голосов
/ 11 марта 2012

Я пишу игру на C ++ с использованием OpenGL, и у меня возникают проблемы с использованием файловых потоков для импорта результатов в файл и их экспорта в программу для отображения.

У меня есть следующие функции для импорта и экспорта рекордов: (какой-то код был там, где я пытался отладить проблему)

void DisplayScores(void) // is going to be called by LoadHighScores()

{

glRasterPos2i(HighScore::x, HighScore::y);
printString(lineholder);

HighScore::y -= 15;
std::cout << "lineholder before being cleared: " << lineholder << std::endl;
lineholder = "";

}

void LoadScores(void) // Loads the high scores // called when the high scores option     on the main menu has been selected

{

std::ifstream scorelist("scorelist.txt");

while (!scorelist.eof())

{

    scorelist.get(getletter);

    switch(getletter)

    {

        case '\n': DisplayScores(); break;
        default: lineholder = lineholder + getletter; break;

    }

}

scorelist.close();

}

void AddScore(char* name, int score) // takes arguments of the name of the player who has     just played the game and their score is also passed and copied to the config file

{

std::ofstream addscore("scorelist.txt", std::ios::app);

addscore << name; // name of the player achieving the score
addscore << ":"; // if addscore.get() == ':' you know the score is going to come after this
addscore << score;
addscore << std::endl; // end the line in the text file so when you encounter '\n' you     know you need to translate to a new line to display someone elses score

addscore.close();

}

и следующий фрагмент кода, который использует функции: (оператор else является частью ветви главного меню, которая вызывается, если не было выбрано «Play»)

else

{

    // display the high scores here
    std::cout << "in the else statement";
    LoadScores();
    AddScore("this", 20);

}

Когда я собираю программу, я просто получаю «В операторе else», но ничего незаписывается в файл результатов, и, по-видимому, тоже не вызывается DisplayScores ().

текстовый файл просто содержит следующее:

Nick 10 
Jason 50

1 Ответ

1 голос
/ 11 марта 2012

Некоторые примечания:

while( !scorelist.eof() ) почти никогда не то, что вы хотите.istream::eof() устанавливается после того, как первое чтение пошло не так, поэтому проверка istream::eof() в начале цикла означает, что цикл введен, все данные прочитаны, а затем обработаны.Затем, когда достигается eof, вместо чтения данных устанавливается флаг (в функции чтения).Затем выполняется вся обработка (потому что цикл не прерывается), и, наконец, флаг виден.Это часто приводит к тому, что последняя строка файла записывается дважды.

Кроме этого, ваш код для вызова LoadScores() закомментирован.Если это действительный код, который вы используете, то это ваша проблема.Если вы не используете действительный код, обновите ваш вопрос, и я посмотрю еще раз.

...