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

使用fscanf读取文件触发Segment Fault(Core Dumped)问题求助

解决fscanf读取文件触发Segment Fault的问题

核心错误原因

你的代码存在两个致命逻辑错误,直接导致了段错误:

  1. 文件打开判断逻辑完全写反:

    if((grafo = fopen(argv[1], "r"))!= NULL)
    {
        fprintf (stderr, "Could not open file \n");
        exit (EXIT_FAILURE);
    }
    

    这段代码的意思是:如果文件成功打开(fopen返回非空指针),就报错退出。这会导致后续操作的grafo是空指针,调用fscanf(grafo, ...)时直接访问空指针,触发Segment Fault。

  2. 参数检查逻辑错误:
    argc < 1永远不会成立——程序启动时argc至少为1(对应程序自身路径),应该判断argc < 2来检查用户是否传入了文件名参数。

其他潜在问题

  1. fscanf("%s", line)无法按行读取:%s以空白字符(空格、换行、制表符)为分隔符,会把每行中逗号分隔的内容拆成多个"片段"读取,不符合你按行处理节点信息的需求。
  2. 缓冲区大小计算不严谨:MAXPROC+19的预留空间如果遇到多位数ID、或接近16个相连节点的情况,可能会出现缓冲区溢出。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXPROC 16

struct task{
    int valid;
    int next[MAXPROC];
    int id;
};

int main(int argc, char *argv[])
{
    struct task tasks[MAXPROC];
    FILE *grafo;

    // 检查是否传入文件名参数
    if(argc < 2)
    {
        fprintf(stderr, "Need file name to start \n");
        exit(EXIT_FAILURE);
    }

    // 正确判断文件是否打开失败
    if((grafo = fopen(argv[1], "r")) == NULL)
    {
        fprintf (stderr, "Could not open file \n");
        exit (EXIT_FAILURE);
    }

    // 用足够大的固定缓冲区,避免溢出
    char line[256]; 
  
    // 用fgets按行读取,符合业务需求
    while(fgets(line, sizeof(line), grafo) != NULL )
    {
        printf("%s", line);
        // 后续可添加解析每行节点信息的逻辑
    }

    fclose(grafo);
    return 0;
}

节点信息解析建议

如果要解析每行的节点ID、相连节点数量及具体节点,可结合sscanf和字符串拆分实现,示例如下:

// 假设当前行存储在line变量中
int id, count;
if(sscanf(line, "%d,%d", &id, &count) == 2) {
    tasks[id].id = id;
    tasks[id].valid = 1;
    tasks[id].next[0] = 0; // 初始化

    char *ptr = strchr(line, ','); // 定位第一个逗号
    ptr = strchr(ptr+1, ','); // 定位第二个逗号,跳过节点数量字段

    int i = 0;
    while(ptr != NULL && i < count) {
        tasks[id].next[i] = atoi(++ptr); // 解析节点ID
        ptr = strchr(ptr, ','); // 跳到下一个逗号
        i++;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 17:00:25