将游戏的高分保存到文件然后访问它们,如何?

Saving high scores of a game to a file and then accessing them, how?

我想将我的游戏(一个简单的贪吃蛇游戏)的所有分数保存到一个文件中,然后读取所有分数。问题是,不知道会有多少,我不知道如何保存它们。

 Example:
    one person plays it, gets 1200 score, it gets saved; 
2nd person plays it, gets 1000 and sees the first person's score;
3rd person plays, gets 1100 and sees the 1st and 2nd scores. 

我已经用数组完成了,但并没有像我想要的那样工作。

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

ifstream f("score.dat");
ofstream g("score.dat");

int comp(const void* e1, const void* e2){
    int f = *((int*)e1);
    int s = *((int*)e2);
    if(f>s) return 1;
    if(f<s) return -1;
    return 0;
}
int main()
{
    int k=0;
    int n, x;
    cin >> n;
    int* v = new int[n];

    for(int i=0; i<n; i++)
        cin >> v[i];
    for(int i=0; i<n; i++){
        qsort(v, n, sizeof(int), comp);
            g << v[i] << endl;
    }

    while(f >> x){
        k++;
        cout << k << ". " << x << endl;
    }

    return 0;
}

根据你的描述,你想要的是:

  1. 打开文件进行写入
  2. 写入文件
  3. 完成写入文件
  4. 打开文件进行阅读
  5. 从文件中读取
  6. 读取文件完成。

因此您的代码应反映该序列!

关键是你在任何给定时刻都只是从文件中读取或写入,所以 ifstreamofstream 永远不应该同时存在!

有几种方法可以解决这个问题,但最简单的方法是使用函数来隔离它们。以下是您的情况:

void writeScoresToFile(int[] scores, int num_scores) {
  // g only starts existing when the function is called
  ofstream g("score.dat");

  for(int i = 0; i < num_scores; ++i ) {
    g<< v[i] << endl;
  }

  // g is destroyed. This closes the file
}


void readScoresFromFile() {
  // f only starts existing when the function is called
  ifstream f("score.dat");

  int x = 0;
  int k = 0;
  while(f>> x){
    k++;
    cout << k << ". " << x << endl;
  }

  // f is destroyed. This closes the file
}

int main()
{
    int n;
    cin >> n;
    int* v = new int[n];

    // ...

    // You only need to sort once, not inside the loop.
    std::sort(v, v + n);

    writeScoresToFile(v, n);

    readScoresFromFile()

    delete[] n; // <----- if there's a new, there must be a delete.
    return 0;
}

顺便说一句,您的代码还可以在许多其他方面做得更好,但我故意保持原样(除了客观上损坏的东西),以便您可以专注于该特定部分: