C语言如何从TXT文件中正确读取指定数值28和210?
问题分析与解决方案
错误原因
你的代码直接用fscanf(fp, "p edge %d %d", ...)尝试读取目标数值,但文件开头存在k 8和空行,fscanf会从文件起始位置开始匹配格式串。由于开头内容和格式串不匹配,fscanf匹配失败,不会修改datos.vertices和datos.enlaces的取值,最终返回的是结构体未初始化的垃圾数值。
正确实现方法
方法1:逐行读取并解析(推荐)
逐行读取文件内容,找到以p edge开头的行后,再解析该行的两个整数:
struct VyE { int vertices; int enlaces; }; struct VyE obtenerNumVerticesYenlaces(char* ruta){ FILE* fp = fopen(ruta, "r"); // 初始化结构体,避免未找到目标时返回垃圾值 struct VyE datos = {0, 0}; if (fp == NULL) { printf("Error al abrir el archivo\n"); return datos; } char line[256]; // 逐行读取文件 while (fgets(line, sizeof(line), fp) != NULL) { // 尝试解析当前行,成功读取2个整数则退出循环 if (sscanf(line, "p edge %d %d", &datos.vertices, &datos.enlaces) == 2) { break; } } fclose(fp); return datos; }
方法2:用fscanf跳过无关内容
通过循环尝试匹配目标格式,匹配失败时跳过无关的单词,直到找到目标行或文件结束:
struct VyE { int vertices; int enlaces; }; struct VyE obtenerNumVerticesYenlaces(char* ruta){ FILE* fp = fopen(ruta, "r"); struct VyE datos = {0, 0}; if (fp == NULL) { printf("Error al abrir el archivo\n"); return datos; } // 循环尝试匹配目标格式,直到成功读取2个整数 while (fscanf(fp, "p edge %d %d", &datos.vertices, &datos.enlaces) != 2) { // 跳过一个无关单词,%*s表示读取但不存储 if (fscanf(fp, "%*s") == EOF) { // 文件读完未找到目标,终止循环 break; } } fclose(fp); return datos; }
关键注意事项
- 初始化结构体:创建结构体时直接初始化成员为0,避免未找到目标数值时返回垃圾值。
- 检查读取返回值:通过
sscanf或fscanf的返回值判断是否成功读取到2个整数,确保逻辑正确性。
内容的提问来源于stack exchange,提问作者Sergio González
相关产品推荐
相关产品推荐

