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

将wav文件数据存入int数组,现有代码能否实现全量存储?

问题结论

你给出的代码完全无法实现将WAV文件全部数据存入大小为4096的int数组的需求,核心问题如下:

  • 存在基础语法错误:fopen 接口返回的是 FILE* 指针类型,你代码中直接声明 FILE InFile 为栈对象,编译阶段就会报错,程序根本无法运行。
  • 文件打开模式错误:WAV属于二进制格式文件,你使用"r"文本模式打开会导致二进制字节被系统自动做换行符转义,读出的内容完全失真,必须改为"rb"二进制读模式。
  • 无任何写入目标数组的逻辑:当前代码中的fread操作是把数据读到Riff结构体变量中,和你申请的buffer数组完全无关,WAV数据根本不会进入这个数组。
  • 数组容量不足以覆盖绝大多数场景:4096个int的数组总容量仅为 4096 * 4 = 16384 字节(16KB),除非是采样率极低、时长不足1秒的超短WAV文件,否则根本装不下完整的WAV文件数据。
  • 缺少基础容错逻辑:你没有判断fopen的返回值是否为空,一旦文件路径错误、权限不足导致打开失败,后续fread操作会直接触发内存访问错误导致程序崩溃。
简易修正示例
int BufferSize = 4096;
int* buffer = new int[BufferSize];
// 二进制模式打开文件
FILE* InFile = fopen(pParent->m_StrWavFileName, "rb");
if (InFile == NULL) {
    // 自定义文件打开失败的处理逻辑
    delete[] buffer;
    return;
}
// 读取WAV文件头
size_t headerRead = fread(&Riff, 1, sizeof(RiffWav), InFile);
// 读取采样数据到buffer,单次最多读BufferSize个int,要读取全量数据需要配合循环读+动态扩容buffer逻辑
size_t dataRead = fread(buffer, sizeof(int), BufferSize, InFile);

// 操作完成后关闭文件、释放堆内存
fclose(InFile);
delete[] buffer;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:27:05