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; }
核心修改点
- 删除无用的
buffer指针,改用固定大小的like_buf存储点赞数文本,避免未初始化内存问题。 - 统一用
fgets读取所有行,严格匹配文件「行成对」的格式,彻底解决读取错位。 - 用
atoi替代getw,将文本格式的点赞数转换为整数,符合文件存储规则。 - 添加帖子行换行符去除逻辑,避免帖子内容带多余换行。
- 补充文件关闭操作,修复原代码的资源泄漏问题。
- 添加格式错误判断,若读完帖子行后无对应点赞数行,会提示并终止循环。
内容的提问来源于stack exchange,提问作者Offsky
相关产品推荐
相关产品推荐

