Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 写入新WAV时出现分段错误_C_File Io_Wav - Fatal编程技术网

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);