You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从TXT文件提取国名并将奖牌数据分别存入二维数组?

问题描述

需要从如下格式的文本文件中,分别提取并存储国家名称和对应的三列奖牌数据(对应每一行的第1、2、3个数字):

文本文件内容:

Australia   67      57      54   
England     57      66      53   
Canada      26      32      34   
India       22      16      23   
NewZealand  20      12      17   
Scotland    13      11      27   
Nigeria     12      9       14   
Wales       8       6       14   
SAfrica     7       9       11    
Uganda      3       0       2
Samoa       1       4       0
BVIslands   2       0       0
Ghana       0       2       3
Namibia     0       0       4
Dominica    0       2       0

当前代码仅读取整行内容到countryNames数组,未分离出奖牌数据,还存在重复关闭文件的错误,需修改代码实现需求。

修改后的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define COUNTRIES 15
#define MEDALCAT 3
#define MAX_LENGTH_CNAME 100

void readFromFile(char fileWithMedals[30], int country[COUNTRIES][MEDALCAT],
                  char countryNames[COUNTRIES][MAX_LENGTH_CNAME])
{
    // 使用传入的文件名,避免硬编码
    FILE *cWealth = fopen(fileWithMedals, "r");
    if (cWealth == NULL) {
        printf("错误:无法打开文件!");
        exit(1);
    }

    int line = 0;
    char buffer[MAX_LENGTH_CNAME + 20]; // 预留足够空间存储整行内容

    // 逐行读取并解析数据
    while (line < COUNTRIES && fgets(buffer, sizeof(buffer), cWealth) != NULL) {
        // 格式化解析:提取国名和三个奖牌数字
        if (sscanf(buffer, "%s %d %d %d", 
                   countryNames[line], 
                   &country[line][0], 
                   &country[line][1], 
                   &country[line][2]) == 4) {
            line++;
        }
    }

    fclose(cWealth);

    // 验证读取结果
    printf("读取完成,数据如下:\n");
    for (int i = 0; i < line; i++) {
        printf("%-12s 第1列:%d 第2列:%d 第3列:%d\n", 
               countryNames[i], 
               country[i][0], 
               country[i][1], 
               country[i][2]);
    }
}

// 示例主函数
int main() {
    int medalData[COUNTRIES][MEDALCAT];
    char countryNames[COUNTRIES][MAX_LENGTH_CNAME];
    readFromFile("commonWealth.txt", medalData, countryNames);
    return 0;
}
关键修改说明
  • 灵活使用文件名:把原代码硬编码的文件名改为函数参数,适配不同文件路径。
  • 格式化解析数据:用sscanf一次性拆分每行内容,将国名存入字符串数组,三个数字分别存入二维数组对应位置。
  • 修复文件操作错误:删除重复的fclose调用,仅在文件操作完成后关闭一次。
  • 防越界处理:循环中加入line < COUNTRIES判断,避免数组溢出。
  • 验证输出:添加测试打印,确认数据读取正确。

内容的提问来源于stack exchange,提问作者Yuvan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 08:45:32