问题与CS50反向!音频文件是反向的,似乎罚款给我,但最终检查reverse.c反向升序不勾选

k5hmc34c  于 2023-03-17  发布在  其他
关注(0)|答案(1)|浏览(156)

这是我的代码,音频文件看起来非常好,声音颠倒,唯一没有检查过的是cs50的最后一个滴答声!请有人能帮我提前感谢!
:(reverse. c反转升序比例文件未按指定反转

#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值和东西,但似乎没有什么修复它

pjngdqdw

pjngdqdw1#

while循环中的第一个fseek跳过要读取的第一条记录。
应该从查找循环之前的第一条记录开始,我建议这样重新排列(未测试):

fseek(input, -size, SEEK_END);              // align with final record
while(ftell(input) >= sizeof(header))       // changed this condition
{
    fread(buffer, size, 1, input);
    fwrite(buffer, size, 1, output);
    if(fseek(input, -2 * size, SEEK_CUR))   // align with next record
    {
        return 1;
    }
}

为了便于移植,文件应该以二进制模式"rb""wb"打开--在Windows上这是必不可少的。为了健壮,检查所有文件函数调用是否返回您期望的值。

相关问题