CS50 reverse.c音频反转功能未通过官方检查求助
CS50 reverse.c 反转音频无法通过升音阶反转测试
我编写的reverse.c程序生成的反转音频听起来正常,但在CS50的最终检查中,“reverse.c reverses ascending scale”项未通过,提示:
:( reverse.c reverses ascending scale file is not reversed as specified
我尝试调整fseek参数但问题依旧,以下是我的代码:
#include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.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("enter wav files"); return 1; } else if(strstr(argv[1], ".wav") != NULL && strstr(argv[2], ".wav") != NULL) { ; } else { return 1; } // Open input file for reading // TODO #2 FILE *input = fopen(argv[1], "r"); if(input == NULL) { printf("no file was opened"); return 1; } // Read header // TODO #3 WAVHEADER header; fread(&header, sizeof(WAVHEADER), 1, input); // Use check_format to ensure WAV format // TODO #4 if(check_format(header) == 0) { return 1; } // Open output file for writing // TODO #5 FILE *output = fopen(argv[2], "w"); // Write header to file // TODO #6 fwrite(&header, sizeof(WAVHEADER),1, output); // Use get_block_size to calculate size of block // TODO #7 int size = get_block_size(header); int audio_size = header.subchunk2Size / size; // Write reversed audio to file // TODO #8 BYTE *buffer = malloc(size); fseek(input, size, SEEK_END); while(ftell(input) - size >= sizeof(header)) { if(fseek(input, -2 * size, SEEK_CUR)) { return 1; } fread(buffer, size, 1, input); fwrite(buffer, size, 1, output); } } int check_format(WAVHEADER header) { // TODO #4 BYTE format[] = {'W','A','V','E'}; for(int i = 0; i < 4; i++) { if(header.format[i] != format[i]) { return 0; } } return 1; } int get_block_size(WAVHEADER header) { int bytes = 0; bytes += (header.bitsPerSample / 8) * header.numChannels; return (bytes); }
问题原因与修复方案
你的代码在音频块反转的fseek逻辑上存在错误,导致首尾的音频块没有被正确处理,所以无法通过升音阶测试。具体修复如下:
修正文件打开模式:
必须用二进制模式打开WAV文件,避免Windows系统下的格式转换问题:FILE *input = fopen(argv[1], "rb"); FILE *output = fopen(argv[2], "wb");重构音频反转的指针逻辑:
原代码的初始定位和循环条件会漏掉第一个音频块,修改后的反转逻辑如下:// Write reversed audio to file BYTE *buffer = malloc(size); if (buffer == NULL) { fclose(input); fclose(output); return 1; } // 定位到最后一个音频块的起始位置 fseek(input, -size, SEEK_END); // 循环读取直到音频数据起始位置(header之后) while (ftell(input) >= sizeof(WAVHEADER)) { fread(buffer, size, 1, input); fwrite(buffer, size, 1, output); // 仅当未到达header位置时,往前跳两个块 if (ftell(input) > sizeof(WAVHEADER)) { fseek(input, -2 * size, SEEK_CUR); } } free(buffer); fclose(input); fclose(output);补充资源释放:
原代码未关闭文件、未检查malloc结果,修复后需添加这些步骤避免资源泄漏和崩溃。
内容的提问来源于stack exchange,提问作者James Gui
相关产品推荐
相关产品推荐

