如何将含malloc动态数组的结构体写入文件并读取s_bits内容
带动态指针的结构体文件读写解决方案
你的问题核心在于:结构体中的s_bits是指针类型,直接用fwrite写入结构体时,只会把指针的内存地址值写入文件,而非指针指向的动态数组实际数据。读取时这个地址已无效,自然拿不到真实内容。
正确写入步骤
需要分两步写入:先写结构体本身,再写动态数组的内容,确保数据完整存储。
示例代码:
// 假设res已分配空间,res->s_bits已malloc并填充数据 FILE *fp = fopen("codi.dat", "wb"); if (!fp) { perror("打开文件失败"); return -1; } // 1. 写入结构体(包含指针地址,后续读取时会重新分配内存) if (fwrite(res, sizeof(struct save), 1, fp) != 1) { perror("写入结构体失败"); fclose(fp); return -1; } // 2. 写入s_bits指向的动态数组内容 if (fwrite(res->s_bits, sizeof(char), res->s_sim, fp) != res->s_sim) { perror("写入动态数组失败"); fclose(fp); return -1; } fclose(fp);
正确读取步骤
读取需对应写入顺序:先读结构体,再根据结构体中的s_sim值分配内存,最后读取动态数组内容。
示例代码:
struct save *res_read = malloc(sizeof(struct save)); if (!res_read) { perror("分配结构体内存失败"); return -1; } FILE *fp = fopen("codi.dat", "rb"); if (!fp) { perror("打开文件失败"); free(res_read); return -1; } // 1. 读取结构体 if (fread(res_read, sizeof(struct save), 1, fp) != 1) { perror("读取结构体失败"); fclose(fp); free(res_read); return -1; } // 2. 为s_bits分配对应大小的内存 res_read->s_bits = malloc(sizeof(char) * res_read->s_sim); if (!res_read->s_bits) { perror("分配动态数组内存失败"); fclose(fp); free(res_read); return -1; } // 3. 读取动态数组内容 if (fread(res_read->s_bits, sizeof(char), res_read->s_sim, fp) != res_read->s_sim) { perror("读取动态数组失败"); fclose(fp); free(res_read->s_bits); free(res_read); return -1; } fclose(fp); // 使用完毕后释放内存 free(res_read->s_bits); free(res_read);
注意事项
- 必须以二进制模式打开文件(
wb/rb),避免文本模式的换行符转换破坏二进制数据 - 读写顺序必须严格匹配:先结构体后动态数组,不可颠倒
- 务必检查每个IO操作的返回值,及时处理错误
- 读取完成后要释放所有分配的内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者Gabriel Lizardi
相关产品推荐
相关产品推荐

