小羊爱吃小草 发表于 2023-12-15 08:19:21

导入

void ImportPlayer(Player players[], int* num_players)
{
        int i = 0;
        FILE* file = fopen("info.txt", "r");
        if(file = NULL)
        {
                printf("无法打开文件!\n");
                return;
        }
        fscanf(file, "%d", num_players);
        for(i = 0; i < *num_players; i++)
        {
                fscanf(file, "%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.score);
        }
        fclose(file);
        file = NULL;
        printf("棋手信息导入成功!\n");
}

导入之后为什么导入的信息运行时显示不了

FishC 发表于 2023-12-15 08:19:42

在您的代码中,存在两个问题导致导入的信息无法正确显示。

首先,文件打开函数应该是 `fopen`,而不是 `file`。所以,您需要将代码中的 `if(file = NULL)` 修改为 `if(file == NULL)`,以正确判断文件是否成功打开。

其次,您在导入数据时使用了 `%20s`、`%21s`、`%10s`、`%12s`、`%18s` 这样的格式化字符串,这会导致导入数据时出现格式不匹配的问题。因为 `%s` 只能用于字符串导入,而不能限定字符串的长度。所以,您需要修改导入数据的代码,使用 `fgets` 函数逐行读取文件内容,并使用 `sscanf` 函数进行解析。

下面是修改后的代码:

void ImportPlayer(Player players, int* num_players)
{
    int i = 0;
    FILE* file = fopen("info.txt", "r");
    if(file == NULL)
    {
      printf("无法打开文件!\n");
      return;
    }
    fscanf(file, "%d", num_players);

    char line;// 假设每行最多有100个字符
    fgets(line, sizeof(line), file);// 读取并忽略第一行

    for(i = 0; i < *num_players; i++)
    {
      fgets(line, sizeof(line), file);// 逐行读取文件内容
      sscanf(line, "%20s\t%21s\t%10s\t%12s\t%18s\n", players.id, players.name, players.identity, players.rank, players.score);
    }
    fclose(file);
    file = NULL;
    printf("棋手信息导入成功!\n");
}

修改后的代码使用 `fgets` 函数逐行读取文件内容,并将每一行的内容存储在 `line` 字符数组中。然后,使用 `sscanf` 函数对 `line` 中的内容进行解析,将每个字段赋值给相应的 `players` 结构体成员。

请确保您的 `Player` 结构体定义正确,并根据实际需要调整字符数组 `line` 的大小。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 导入