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
相关产品推荐
相关产品推荐

