You need to enable JavaScript to run this app. C语言如何按行读取txt文件内容并存入自定义结构体数组?
优惠活动
大模型
产品
解决方案
定价
更多

C语言如何按行读取txt文件内容并存入自定义结构体数组?

原代码问题排查

以下是导致代码无法正常运行的具体错误,按出现位置排列:

  • 结构体定义语法错误:结构体收尾的大括号后漏写分号,直接衔接全局结构体数组allTowns的定义,会直接触发编译失败。
  • 文件读取格式不匹配:fscanf的格式串写为"%s,%s,%d\n",以逗号作为字段分隔符,但实际待读取的txt文件内字段以空格、制表符分隔,不存在逗号字符,会导致读取流程完全无法匹配内容。
  • 结构体数组索引缺失:原代码写入字段时写为allTowns[].startTown、allTowns[].endTown,方括号内未传入当前要写入的数组下标,且已定义的计数变量i未做递增操作,无法逐行把数据存入数组的不同位置。
  • 取地址符号使用冗余:原代码对char类型的数组成员startTown、endTown额外加了&取地址,这类数组成员本身就存储了字符串的首地址,传入fscanf时不需要额外取地址,冗余操作会触发编译器类型不匹配警告。
  • 打印字段对象错误:原代码printf时写为allTowns.energyExpended,未指定数组下标,读取的是结构体数组首地址对应的字段值,并非当前行读取到的能量消耗数值。
可正常运行的代码实现
struct intertownEnergy{
    char startTown[256];
    char endTown[256];
    int energyExpended;
} allTowns[1024];

int openEnergyFile(void)
{
    FILE* energyFilePtr = fopen("energy.txt", "r");
    int i = 0;
    if (energyFilePtr == NULL){
        printf("the file doesn't exist");
        return 0;
    }

    while(!feof(energyFilePtr)){
        // 数组成员本身为地址,无需额外加&
        fscanf(energyFilePtr, "%s%s%d\n", 
            allTowns[i].startTown, 
            allTowns[i].endTown, 
            &allTowns[i].energyExpended);
        printf("energy test for each line: %d\n", allTowns[i].energyExpended);
        i++;
    }

    return 0;
}

小提示:当前用feof()作为循环判断条件,会在读取完文件最后一行后多执行一次无效读取,更稳妥的写法是判断fscanf的返回值——当fscanf成功读取到3个匹配字段时,再执行数组写入和打印操作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 14:24:02