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

C语言读取含ID与名称的文本文件无输出问题排查

问题分析与修复方案

咱们来一步步拆解你代码里的问题,以及怎么修复它:

1. 未初始化的指针是核心问题

你声明了char *firmName;,但这个指针根本没指向任何有效的内存空间。直接用fscanf往这个空指针里写字符串,会触发未定义行为——可能程序崩溃,也可能输出空内容,这就是你现在遇到的情况。

2. printf里的错误写法

你写的printf("%d %s\n", firmId, *firmName);中,*firmName是取指针指向的第一个字符,而%s格式符需要的是整个字符串的指针,这里应该直接用firmName。

3. feof的使用误区

用while (!feof(firmFilePtr))当循环条件是个常见坑,feof只有在读取操作失败后才会返回true,这会导致最后一次读取失败的无效数据也被打印出来。正确的做法是把fscanf的返回值作为判断条件——如果它成功读取了你要的2个字段(ID和名称),就继续循环。

4. 文本文件格式不匹配

你的firms.txt内容是101 eti300 superfresh502 pinar91 banvit,这个格式和你用%d%s读取的预期不匹配(你期望每个ID对应一个名称)。得改成每个ID和名称成对分开的格式,比如:

101 eti
300 superfresh
502 pinar
91 banvit

或者用空格分隔的成对数据:101 eti 300 superfresh 502 pinar 91 banvit


修复后的完整代码

#include <stdio.h>
#include <stdlib.h> // 用于malloc和free

// 函数声明
void readFirms(char *filename);

int main(void) {
    readFirms("C:\\Users\\hakan\\Desktop\\firms.txt");
    return 0;
}

void readFirms(char *filename) {
    FILE *firmFilePtr;
    if ((firmFilePtr = fopen(filename, "r")) == NULL) {
        puts("File could not be opened.");
        return; // 文件打开失败直接返回,避免后续错误
    } else {
        unsigned int firmId;
        // 分配足够内存存储公司名称,这里假设最长不超过255字符
        char *firmName = malloc(256 * sizeof(char));
        if (firmName == NULL) {
            puts("Memory allocation failed.");
            fclose(firmFilePtr);
            return;
        }
        
        // 用fscanf的返回值判断是否成功读取2个字段
        while (fscanf(firmFilePtr, "%u %s", &firmId, firmName) == 2) {
            printf("%u %s\n", firmId, firmName);
        }
        
        free(firmName); // 释放分配的内存,避免内存泄漏
        fclose(firmFilePtr);
    }
}

额外小提示

  • 如果你觉得手动分配内存麻烦,也可以用固定大小的字符数组,比如char firmName[256];,这样就不用调用malloc和free了,更简单。
  • 你的firmId是unsigned int类型,用%u格式符比%d更匹配,避免类型不匹配的问题。
  • 一定要确保firms.txt的格式正确,每个ID和名称成对出现,这样fscanf才能准确读取数据。

内容的提问来源于stack exchange,提问作者H.Ozer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:01:48