将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
相关产品推荐
相关产品推荐

