使用fscanf读取文件触发Segment Fault(Core Dumped)问题求助
解决fscanf读取文件触发Segment Fault的问题
核心错误原因
你的代码存在两个致命逻辑错误,直接导致了段错误:
文件打开判断逻辑完全写反:
if((grafo = fopen(argv[1], "r"))!= NULL) { fprintf (stderr, "Could not open file \n"); exit (EXIT_FAILURE); }这段代码的意思是:如果文件成功打开(
fopen返回非空指针),就报错退出。这会导致后续操作的grafo是空指针,调用fscanf(grafo, ...)时直接访问空指针,触发Segment Fault。参数检查逻辑错误:
argc < 1永远不会成立——程序启动时argc至少为1(对应程序自身路径),应该判断argc < 2来检查用户是否传入了文件名参数。
其他潜在问题
fscanf("%s", line)无法按行读取:%s以空白字符(空格、换行、制表符)为分隔符,会把每行中逗号分隔的内容拆成多个"片段"读取,不符合你按行处理节点信息的需求。- 缓冲区大小计算不严谨:
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
相关产品推荐
相关产品推荐

