C语言循环写入.ts二进制文件时文件大小不增长如何解决?
问题原因
你当前代码无法实现追加写入的核心原因是文件打开模式使用错误,fopen的"wb"模式会在每次打开文件时清空原有内容,从头写入,因此每次写入后文件大小都是单次写入的字节数,同时代码还存在多处语法和逻辑错误需要修正。
具体修改点
- 替换文件打开模式:将
"wb"改为"ab",a代表追加模式,写入数据时会自动定位到文件末尾,不会清空原有内容,b代表二进制模式,适配.ts视频二进制文件的写入需求。 - 修正宏定义错误:
#define data_size 1213;末尾多余的分号会导致后续数组声明语法报错,删除末尾分号即可。 - 修正路径错误:
fopen传入的文件路径字符串末尾多了一个多余空格,会导致文件创建/打开路径错误,需要删除该空格。 - 补全循环写入逻辑:当前代码没有循环结构,仅执行单次写入,需要将写入逻辑包裹在循环体内,每次获取到新的流数据后执行写入操作。
- 修正写入参数:
source_size初始值为0会导致写入数据为空,每次拿到流数据后需要给source_size赋值为实际读取到的数据长度(你场景下预期为1213字节)。 - 补充资源释放逻辑:写入完成后需要调用
fclose(fileopen)关闭文件,避免缓冲区数据未写入磁盘导致文件内容缺失。
修正后代码示例
// 宏定义末尾不要加多余分号 #define data_size 1213 unsigned char sourcebuf[data_size + 1]; int source_size = 0; FILE * fileopen; // 用ab模式打开文件,二进制追加写入,删除路径末尾多余空格 fileopen = fopen("/cache/test/pull_data.ts", "ab"); if (fileopen == NULL) { printf("error : pull_data.ts opening file "); exit(1); } else { printf("success : pull_data.ts opening file "); } // 循环写入逻辑,可根据实际流数据获取逻辑调整循环终止条件 while(/* 流数据未结束的判断条件,例如收到结束标识、读取失败等 */) { // 此处补充你获取流数据到sourcebuf的逻辑,source_size赋值为实际读取长度 source_size = data_size; // 写入数据到文件 fwrite(sourcebuf, source_size, 1, fileopen); // 可选:每次写入后立即刷入磁盘,避免异常掉电丢失缓冲区数据 fflush(fileopen); } // 所有写入完成后关闭文件释放资源 fclose(fileopen);
内容的提问来源于stack exchange,提问作者GNK
相关产品推荐
相关产品推荐

