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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 16:36:02