我正在try 写一个音频反向过滤器的代码,将反向CS50课程(编程新手)音频WAV文件.我设法完成了整个任务,并在一个输入文件上进行了try ,但我听到的声音颠倒了过来,然而,判断50函数指出,我的文件没有正确颠倒.当我不知道问题出在哪里时,我很难发现问题所在.我希望有人能发现我遗漏的一个明显的问题.

我只是一直通读代码,找不到具体的问题.我try 颠倒我的输出文件,它听起来与输入文件一模一样,但我不能确定它是否在幕后实际上是相同的.

#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.wav\n");
        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 supported\n");
        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))

C++相关问答推荐

理解C中的指针定义

rSP堆栈指针在返回函数调用的值时有任何用途吗?

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

C/C++中的状态库

球体—立方体重叠:无、部分或全部?

va_copy的使用是未定义的行为吗?

无效指针值在函数调用之间莫名其妙地改变

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

调用mProtection将堆栈上的内存设置为只读,直接导致程序SIGSEGV

获取每个循环迭代结束时的当前时间

如何使解释器存储变量

如何用c语言修改shadow文件hash部分(编程)?

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

';\n&39;和';\r&39;中的';\n&39;之间有什么关系?

通过k&;r语法的c声明无效

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

使用替代日历打印日期

使用复合文字数组初始化的指针数组

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

C 中 struct 体自赋值是否安全?特别是如果一侧是指向 struct 的指针?