gpt4 book ai didi

c - 通过C操作文件制作排行榜前5名

转载 作者:行者123 更新时间:2023-11-30 19:26:02 26 4
gpt4 key购买 nike

我正在制作一个 Connect 4 游戏作为项目的一部分,我想为其添加额外的功能,但我很挣扎。

该代码是我编写的一个函数,它采用一个结构体(lb 排行榜),并尝试将文件中所有输入的难度读取到大小为 6 的 lb 数组中,其中包括机器人的难度、回合数以及玩家的姓名,然后按回合计数顺序对其进行组织,并将前 5 名重新打印回文件中。我将旧数组的第一个元素设置为组织函数位传递的排行榜数据结构。

但是,当我使用模板输入进行设置时,每个输入都用新行分隔,如下所示:0 7 詹姆斯0 13 吉米0 8 约书亚0 6 查理0 9 jack

它将其打印到文件中:

0 7 詹姆斯0 13 吉米0 8 约书亚0 6 查理(0 9 Jack 1982289408 0 ) 同一条线

结构看起来也是这样的{int 回合数整数差异字符名称[20]}

我对编码非常陌生,因此非常感谢您的帮助!

lb old[6];
lb temp;

FILE *file;



if (leaderboard.diff == 0){
file = fopen("leaderboard0.txt", "r+");}
else if (leaderboard.diff == 1){
file = fopen("leaderboard1.txt", "r+");}
else if (leaderboard.diff == 2){
file = fopen("leaderboard2.txt", "r+");}

fseek( file, 1, SEEK_SET );
old[0] = leaderboard;

for (int i = 1; i < 6; i++){
fscanf(file, "%i %i %s", old[i].diff, old[i].turn_count, old[i].name);}

for (int i = 0; i < 6; i++){
for (int j = i + 1; j < 6; j++)
if (old[i].turn_count > old[j].turn_count)
{
temp = old[i];
old[i] = old[j];
old[j] = temp;
}}

for (int i = 0; i < 5; i++){
fprintf(file, "%i %i %s\n", old[i].diff, old[i].turn_count, old[i].name);
fclose(file);}

}

最佳答案

欢迎来到 StackOverflow,JJewson

首先,我强烈建议您正确缩进代码。只有这样一个错误才会显而易见:

lb leaderboard = { ... }; /* was missing from your source code */
lb old[6]; /* you should rename this */
lb temp;

FILE *file;

/* somthing that opens a block was missing from your example source */ {
if (leaderboard.diff == 0) {
file = fopen("leaderboard0.txt", "r+");
} else if (leaderboard.diff == 1) {
file = fopen("leaderboard1.txt", "r+");
} else if (leaderboard.diff == 2) {
file = fopen("leaderboard2.txt", "r+");
}

fseek( file, 1, SEEK_SET );
old[0] = leaderboard;

for (int i = 1; i < 6; i++) {
fscanf(file, "%i %i %s", old[i].diff, old[i].turn_count, old[i].name);
}

for (int i = 0; i < 6; i++) {
for (int j = i + 1; j < 6; j++) {
if (old[i].turn_count > old[j].turn_count) {
temp = old[i];
old[i] = old[j];
old[j] = temp;
}
}
}

for (int i = 0; i < 5; i++) {
fprintf(file, "%i %i %s\n", old[i].diff, old[i].turn_count, old[i].name);
fclose(file); /* this is the obvious error, it should go below this loop */
}
fclose(file); /* here it should be */
}
  • 最好将 leaderboard 重命名为 leader,然后将 old 重命名为 leaderboard
  • 我已经提到需要将 fclose 调用移到循环之外。您在第一次写入后关闭文件。
  • 我不明白您第一次使用 fseek( file, 1, SEEK_SET );:为什么要跳过文件的第一个字符? (文件偏移量从 0 开始,而不是 1)。另外:成功fopen后,文件指针始终指向文件的开头。
  • 阅读排行榜后,您应该fclose该文件,然后重新打开它以进行(覆盖)写入。 (如果排行榜很重要,最好保留备份)。所以:打开"r"用于读取、读取、关闭,打开"w"用于写入、写入、关闭。
  • 您不会在代码中进行任何错误检查。您应该修复该问题并通知用户错误,并尝试尽可能优雅地处理错误。 (即,如果写入失败,不要丢失排行榜。)
  • 关于添加的部分1982289408 0:确保您的新领导者(struct ‘leaderboard’)已正确初始化。
  • 您的算法有一个小问题:一位与前一位玩家表现完全一样的新玩家会将前一位玩家移出排行榜。要解决此问题,请将文件加载到 old[0..4] 并将新的领导者放入 old[5] (而不是将其放入 old[0 ] 以及 old[1..5] 中的文件内容)
  • 小幅改进:排序循环:for (int i = 0; i < 6; i++) for (int j = i + 1; j < 6; j++)-> for i 循环只需从 0 .. 4 开始运行,因此for (int i = 0; i < 5; i++)` 就足够了。

关于c - 通过C操作文件制作排行榜前5名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58039362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com