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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 23:55:27