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

C语言读取TAB分隔整数文件异常:所有读取值返回0

解决C语言读取TAB分隔数据文件值全为0的问题

你的代码读取数据全为0,核心原因是第一行表头被当成整数读取导致fscanf失败,后续读取连锁出错,再加上格式串的小问题,以下是具体修复步骤:

  • 必须跳过表头行:文件第一行是字符串表头P C D,用%d格式读取会直接失败,fscanf返回0且读取位置不推进,导致所有数据都无法正确读入。可以用fgets跳过第一行:

    char buffer[256];
    fgets(buffer, sizeof(buffer), file_ptr); // 跳过表头行
    
  • 移除格式串末尾的空格:你的格式串"%d %d %d "末尾多了一个空格,这会让fscanf在读取完第三个整数后,持续跳过空白字符直到遇到非空白,在文件末尾时可能导致读取阻塞或异常。改成"%d %d %d"即可——%d本身会自动跳过所有空白(包括TAB、空格、换行),无需特意处理TAB分隔。

  • 检查fscanf的返回值:每次读取后确认是否成功读取了3个整数,方便快速排查问题:

    int ret = fscanf(file_ptr, "%d %d %d", &system.tasks[i].p, &system.tasks[i].c, &system.tasks[i].d);
    if (ret != 3) {
        printf("第%d行读取失败,返回值:%d\n", i+1, ret);
        break;
    }
    
  • 确认N_LINES的正确性:确保N_LINES的值等于文件中实际数据行的数量(不包含表头),如果N_LINES过大,超出文件实际行数,后续读取会失败,值保持初始化的0。

  • 验证文件路径:确认system_file指向的文件路径正确,比如相对路径是否和程序运行目录匹配,也可以尝试用绝对路径测试。

修改后的完整代码示例:

FILE *file_ptr = fopen(system_file, "r");
if (file_ptr == NULL) {
    printf("no such file.\n");
    return 0;
}

// 跳过表头行
char buffer[256];
if (fgets(buffer, sizeof(buffer), file_ptr) == NULL) {
    printf("文件为空或读取表头失败\n");
    fclose(file_ptr);
    return 0;
}

for (int i = 0; i < N_LINES; i++){
    int ret = fscanf(file_ptr, "%d %d %d", &system.tasks[i].p, &system.tasks[i].c, &system.tasks[i].d);
    if (ret != 3) {
        printf("读取第%d行数据失败,实际读取%d个值\n", i+1, ret);
        break;
    }
}

fclose(file_ptr); // 记得关闭文件,避免资源泄漏

如果需要明确指定仅用TAB分隔(比如防止数据字段内有空格的情况),可以改用%d\t%d\t%d格式串,注意行尾无TAB时,最后一个%d仍能正常读取,因为%d会忽略换行等空白。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:31:06