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

C语言文件读取异常:fscanf读取社交网络帖子数据出错

修复社交网络帖子数据的文件读取问题

我需要从文件读取社交网络风格的帖子数据,填充Post结构体后存入Queue队列,但load_user_from_file函数存在读取异常:点赞数读取错误(会取到无关数字),还会生成多余帖子,把数字同时当作帖子内容和点赞数。原函数代码如下:

int load_user_from_file(struct Coda* Bacheca,char* nome_file){
    
    FILE* fp=fopen(nome_file,"r");
    
    if(fp == NULL){
        printf("errore lettura file");
        return -1;
        
    }else{
        printf("\nFile in lettura...");
    }
    
    int len=64;
    char tmp_msg[len];
    int tmp_n_like;
    char* buffer ;
    
    while(fgets(tmp_msg,len,fp) != NULL  ){
            
                fscanf(fp,"%s",buffer);
        tmp_n_like=getw(fp);
        
        printf("Eureka\n");
        
        printf("%s %d\n",tmp_msg,tmp_n_like);
        
        struct Post* new_post = generate_Post(tmp_msg,tmp_n_like); 
        insert_in_queue(Bacheca,*new_post);
    
    }
    
    return 0;
}

文件格式规则:每行是帖子内容,下一行是对应的点赞数(文本格式的整数)。


问题根源分析

  • 未初始化指针buffer:仅声明指针未分配内存,直接用fscanf写入会触发未定义行为,破坏内存结构。
  • 读取函数混用错误:getw是二进制读取函数,用于读取机器原生字节序的整数,但点赞数是文本格式,两者不匹配。
  • 读取逻辑不匹配文件格式:文件是「帖子行+点赞数行」成对出现,但当前循环用fgets读帖子后,又用fscanf+getw两次读取,彻底打乱了行的对应关系,导致读取错位。

修复后的代码

int load_user_from_file(struct Coda* Bacheca, char* nome_file) {
    FILE* fp = fopen(nome_file, "r");
    if (fp == NULL) {
        printf("errore lettura file");
        return -1;
    } else {
        printf("\nFile in lettura...");
    }

    const int len = 64;
    char tmp_msg[len];
    char like_buf[16]; // 存储点赞数的文本行
    int tmp_n_like;

    // 按「帖子行+点赞数行」的成对规则读取
    while (fgets(tmp_msg, len, fp) != NULL) {
        // 移除帖子行末尾的换行符
        size_t msg_len = strlen(tmp_msg);
        if (msg_len > 0 && tmp_msg[msg_len - 1] == '\n') {
            tmp_msg[msg_len - 1] = '\0';
        }

        // 读取对应的点赞数行,判断文件格式是否合法
        if (fgets(like_buf, sizeof(like_buf), fp) == NULL) {
            printf("Errore: file formato non valido (mancano like per un post)\n");
            break;
        }

        // 将文本格式的点赞数转换为整数
        tmp_n_like = atoi(like_buf);

        printf("%s %d\n", tmp_msg, tmp_n_like);

        struct Post* new_post = generate_Post(tmp_msg, tmp_n_like);
        insert_in_queue(Bacheca, *new_post);
        // 注意:如果generate_Post用malloc分配内存,需在后续逻辑中释放,避免内存泄漏
    }

    fclose(fp); // 补充文件关闭操作,避免资源泄漏
    return 0;
}

核心修改点

  1. 删除无用的buffer指针,改用固定大小的like_buf存储点赞数文本,避免未初始化内存问题。
  2. 统一用fgets读取所有行,严格匹配文件「行成对」的格式,彻底解决读取错位。
  3. 用atoi替代getw,将文本格式的点赞数转换为整数,符合文件存储规则。
  4. 添加帖子行换行符去除逻辑,避免帖子内容带多余换行。
  5. 补充文件关闭操作,修复原代码的资源泄漏问题。
  6. 添加格式错误判断,若读完帖子行后无对应点赞数行,会提示并终止循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:35:20