有人能告诉我我在这段代码中做错了什么吗?它编译,但它不正确的反向音频文件。它确实扭转了文件排序的不正确的音频是明确的。这是cs50x课程的习题4。我觉得TODO #8有点不对劲。
#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("entre input and output file names\n");
return 1;
}
// Open input file for reading
// TODO #2
char *infile = argv[1];
char *outfile = argv[2];
FILE *inptr = fopen(infile, "r");
if (inptr == NULL)
{
printf("error opening file\n");
fclose(inptr);
return 2;
}
// Read header
// TODO #3
WAVHEADER wv;
fread(&wv, sizeof(WAVHEADER), 1, inptr);
long position = ftell(inptr);
// Use check_format to ensure WAV format
// TODO #4
if (check_format(wv) == -1)
{
printf("input is not a wav.h file\n");
fclose(inptr);
return 3;
}
// Open output file for writing
// TODO #5
FILE *outptr = fopen(outfile, "wb");
if (outptr == NULL)
{
printf("error opening output file\n");
fclose(outptr);
fclose(inptr);
return 4;
}
// Write header to file
// TODO #6
fwrite(&wv, sizeof(WAVHEADER), 1, outptr);
// Use get_block_size to calculate size of block
// TODO #7
int blsize = get_block_size(wv);
// Write reversed audio to file
// TODO #8
DWORD bufferSize = wv.subchunk2Size;
int16_t *audio = malloc(bufferSize);
fseek(inptr, blsize, SEEK_END);
fseek(outptr, position, SEEK_SET);
for (int i = 0; i < bufferSize / blsize; i++)
{
fread(&audio[i], blsize, 1, inptr);
fseek(inptr, (-2) * blsize, SEEK_CUR);
fwrite(&audio[i], blsize, 1, outptr);
}
fclose(outptr);
fclose(inptr);
free(audio);
}
int check_format(WAVHEADER header)
{
// TODO #4
char elmnts[] = {'W', 'A', 'V', 'E', '\0'};
for (int i = 0; i < 4; i++)
{
if (elmnts[i] != header.format[i])
{
return -1;
}
}
return 0;
}
int get_block_size(WAVHEADER header)
{
// TODO #7
int blsize = header.numChannels * (header.bitsPerSample / 8);
return blsize;
}
不知道该怎么办。请帮帮忙。
1条答案
按热度按时间lymgl2op1#
以下是添加到代码区域的一些注解:
要打开一个二进制文件,特别是在Windows上,使用“rb”(或“rb”,就像你做的那样!).
没有伤害,但不要
close()
文件没有成功打开。您分配一个能够容纳文件中所有样本的区域,然后分别读取/写入每个样本,其中涉及大量看似神秘的
fseek()
。有个更简单的方法!我希望这能帮助你理解如何使用C的功能和利用可用的动态内存。
(You应该添加更多的验证,以确保
fread()
加载了所有请求,并且每个fwrite()
也能正常工作。)