C 写入新WAV时出现分段错误
下面是我失败的代码片段:C 写入新WAV时出现分段错误,c,file-io,wav,C,File Io,Wav,下面是我失败的代码片段: #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct WAV { char chunkId[4]; unsigned chunkSize; char format[4]; char subChunk1Id[4]; unsigned subChunk1Size; unsigned short a
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct WAV {
char chunkId[4];
unsigned chunkSize;
char format[4];
char subChunk1Id[4];
unsigned subChunk1Size;
unsigned short audioFormat;
unsigned short numChannels;
unsigned sampleRate;
unsigned byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
char subChunk2Id[4];
unsigned subChunk2Size;
} WAV;
int main() {
void printwav(const WAV *);
void openwav(FILE *, WAV *);
void makewav(FILE *, const WAV *);
char file[FILENAME_MAX];
size_t i;
short
stereo1,
stereo2,
mono1;
FILE
*fpstereo,
*fpmono;
WAV
stereo,
mono;
openwav(fpstereo, &stereo);
printwav(&stereo);
memcpy(&mono, &stereo, sizeof(WAV));
mono.chunkSize -= stereo.subChunk2Size / 2;
mono.subChunk2Size /= 2;
mono.numChannels /= 2;
mono.byteRate /= 2;
mono.blockAlign /= 2;
makewav(fpmono, &mono);
printwav(&mono);
for (i = 0; i < mono.subChunk2Size / sizeof(short); i++) {
fread(&stereo1, sizeof(short), 1, fpstereo);
fread(&stereo2, sizeof(short), 1, fpstereo);
mono1 = (stereo1 + stereo2) / 2;
fwrite(&mono1, sizeof(short), 1, fpmono);
}
fclose(fpstereo);
fclose(fpmono);
}
在使用一组
printf
s进行测试后,我发现分割错误出现在fread(&stereo1,sizeof(short),1,fpstereo)行中代码>在for循环中。我将stereo1
声明为short
而不是short*
,所以我不明白为什么会发生这种情况。有人能解释一下为什么错了吗?我想这是你的问题:
void openwav(FILE *, WAV *);
void makewav(FILE *, WAV *);
这样,函数内的file open调用将仅在函数内可用,而不会返回给调用方
通常应声明如下:
void openwav(FILE **, WAV *);
void makewav(FILE **, WAV *);
这样称呼:
openwav(&fpstereo, &stereo);
makewav(&fpmono, &mono);
fpstereo
无法通过openwav
进行更改<代码>作废openwav(文件**,WAV*)代码>如果要允许changesIMO,它应该在主窗口中打开。“mono1”仍然是一个结构“WAV”,并且结构不会更改大小。因此,我们需要查看printwav()的代码,以确定输出文件大小相同的原因。顺便说一句:发布的代码,即使在伪造被调用的函数之后,也不能干净地编译。一个原因是未使用的变量“name[]”BBTW:代码设计需要一些工作,因为立体声处理都在子函数中,而单声道处理都在main()通常,函数原型应该在#include语句之后,而不是隐藏在某个函数中。@user3629249没有变量name[]
,而mono1
是一个short
,而不是WAV
。底部的for循环是处理文件实际数据的唯一部分。在这两个子函数中,第一个从立体声文件中读取WAV头,而第二个将WAV头写入mono文件,将两个文件*
保留在索引处,开始读取/写入声音数据。好的,我添加了这些,错误不再发生,但是我文件系统中的mono文件说它与立体声文件大小相同。不应该是大约一半吗?为了调试,可能您可以检查两个fread()的返回值,如果返回值为零,则打印一些警告。我发现了问题,我迭代了立体声文件的一半字节,但每次迭代都读取四个字节,因此我在迭代过程的中途到达了立体声文件的末尾。我修复了问题中的for
语句,但除了导致分段错误的部分之外,代码在其他方面语义正确。仅供参考,makewav
和printwav
不会影响WAV*
参数。
openwav(&fpstereo, &stereo);
makewav(&fpmono, &mono);