c语言 - 为什么我的 CS50 音频反向代码不起作用?



我正试图编写一个音频反向过滤器的代码,该代码将为cs50课程(新编程)反转音频wav文件。我设法完成了整个任务,并在输入文件和声音上尝试了它,但是check50函数表明我的文件没有正确地反转。当我不知道问题是什么时,我很难发现问题。我希望有人能指出一个我遗漏的明显问题。

我一直在通读代码,却找不到一个具体的问题。我试着逆转我的输出文件,它听起来完全像输入文件对我来说,但不能确定如果它实际上是相同的引擎盖下。

#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "wav.h"
int check_format(WAVHEADER header);
int get_block_size(WAVHEADER header);
int main(int argc, char *argv[])
{
// Ensure proper usage
// TODO #1
if (argc != 3)
{
printf("Usage: ./reverse inputfilename.wav outputfilename.wavn");
return 1;
}
// Open input file for reading
// TODO #2
FILE *input = fopen(argv[1], "r");
if (input == NULL)
{
printf("Could not open %s.n", argv[1]);
return 1;
}
// Read header
// TODO #3
WAVHEADER *buffer = malloc(1 * sizeof(WAVHEADER));
fread(buffer, sizeof(WAVHEADER), 1, input);
// Use check_format to ensure WAV format
// TODO #4
if (check_format(*buffer) == 1)
{
printf("input file format not supportedn");
return 1;
}
// Open output file for writing
// TODO #5
FILE *output = fopen(argv[2], "w");
if (output == NULL)
{
fclose(input);
printf("Could not create %s.n", argv[2]);
return 5;
}
// Write header to file
// TODO #6
fwrite(buffer, sizeof(WAVHEADER), 1, output);
// Use get_block_size to calculate size of block
// TODO #7
int block_size = get_block_size(*buffer);
// Write reversed audio to file
// TODO #8
FILE *temp = malloc(block_size);
fseek(input, -1 * block_size, SEEK_END);
fread(temp, block_size, 1, input);
fwrite(temp, block_size, 1, output);
while (ftell(input) > 44 || ftell(input) == 44)
{
fseek(input, -2 * block_size, SEEK_CUR);
fread(temp, block_size, 1, input);
fwrite(temp, block_size, 1, output);
}
fclose(input);
fclose(output);
free(temp);
free(buffer);
}
int check_format(WAVHEADER header)
{
// TODO #4
if (header.format[0] != 'W' || header.format[1] != 'A' || header.format[2] != 'V' || header.format[3] != 'E')
{
return 1;
}
return 0;
}
int get_block_size(WAVHEADER header)
{
// TODO #7
int answer = 0;
answer = (header.bitsPerSample / 8) * header.numChannels;
return answer;
}

我在想

while (ftell(input) > 44 || ftell(input) == 44)
{
fseek(input, -2 * block_size, SEEK_CUR);
fread(temp, block_size, 1, input);
fwrite(temp, block_size, 1, output);
}

可能

while (ftell(input) >= sizeof(WAVHEADER))

但我意识到这是错误的结束条件,因为当它在第一个数据记录时,你会寻求,读/写,一个想象的前一个。

所以我建议

while (ftell(input) - 2 * block_size >= sizeof(WAVHEADER))

相关内容

  • 没有找到相关文章

最新更新