//思路:当玩家开始游戏的时候,读取一遍文件,将文件里的数据存入score_top的数组中,到时候输出排行榜时候,只需要输出数组就可以了,读取完文件后进行判断,判断文件状态,若空则写入数据,若不空,则排序,后进行判断,判断当前分数是否大于数组中的分数,若小于,则抛弃这个数据,若大于则将最小的那个数据替换掉,并且更新文件
void sort() //冒泡函数,用来将数组里的数据进行从小到大的排序
{
int temp = 0;
for (int i = 0; i < 5-1; i++)
{
for (int j = 0;j<5-i-1;j++)
{
if (score_top[j]<score_top[j+1])
{
temp = score_top[j];
score_top[j] = score_top[j+1];
score_top[j+1] = temp;
}
}
}
}
int prescore() //写入分数
{
//先初始化score数组
read_file();
FILE *fp=fopen("1.txt","w+"); //重写文件
int temp = 0;
if(fp==NULL){ //判断当前文档的状态,如果是空的则向里面添加数据
fprintf(fp," %s %d\n;",play1.name,play1.score); //写入分数
}else{
sort(); //否则进行排序
// for (int i = 0; i < 5; i++) //写入数据之前进行比较,如果写入的数据比排行榜的数据大,则进行替换,若小则不进行操作
// {
// if ((score_top[i] == 0)) //说明这个参数是空 将输入的数据写入文件中
// {
// score_top[i] = play1.score;
// break; //当时出现的错误是没有在完成数据替换之后结束这个循环,导致数组里的数字//被多次覆盖
// }
// printf("写入后的:%d",score_top[i]);
// }
int min = score_top[4]; //当时是没有进行最小值的比较,直接替换的是比当前数据小但不是最小的数据
printf("min = %d,sc = %d\n",min,score_top[4]);
if (play1.score>min)
{
score_top[4] = play1.score;
}
sort();
}
for (int i = 0; i < 5; i++)
{
printf("排列后的c:%d\n",score_top[i]);
}
for (int i = 0; i < 5; i++)
{
fprintf(fp,"%s %d\n;",play1.name,score_top[i]); //写入分数
printf("打开成功!\n");
}
// scanf("%s %d")
// fprintf(fp,"%s %d\n",play1.name,play1.score);
fclose(fp);
}
void read_file()//读文件的数据
{
FILE *fp;
int temp = 0;
char name_1[10] = {0};
int score_1 = 0;
fp=fopen("1.txt","r");
fscanf(fp,"%s %d",name_1,&score_1); //将文件里的名字和分数进行分割
int i = 0;
while(!feof(fp)) //当文件为空时结束
{
//printf("%s %d\n",name_1,score_1);//将文件的数据赋值给 a 和 sum 变量,然后在进行输出
score_top[i] = score_1;
fscanf(fp,"%s %d",name_1,&score_1);
i++;
}
fclose(fp);//关闭文件
}
但是目前无法完成用户的名字跟随用户的分数一起显示的问题,因为,用户的数据要一直排序,但是用户名怎末匹配呢?难道c中也有map()吗?(......待解决)