0

您好,我想做的是反转二进制文件。文件的类型是 wav,例如,如果通道号为 2,每个样本的位数为 16,则每次我将复制 32/8 = 4 个字节。首先要做的是按原样复制标题(那部分没问题),然后反转他的数据。我创建了一个代码来复制标头,然后从末尾复制部分数据 10 次(用于测试),但是由于某种原因它没有复制 40 个字节,而是在 20 处停止(即使它会执行 20 次它会仍然只复制 20 个字节)。这是执行此操作的代码。如果您能看到它,我无法发现错误告诉我:) 也许错误在其他地方,所以我编写了完整的功能

void reverse(char **array)
{
    int i=0;
    word numberChannels;
    word bitsPerSample;
    FILE *pFile;
    FILE *pOutFile;
    byte head[44];
    byte *rev;
    int count;
    if(checkFileName(array[2]) == 0 || checkFileName(array[3]) == 0)
    {
        printf("wrong file name\n");
        exit(1);
    }
    pFile = fopen (array[2] ,"r");
    fseek(pFile, 22, SEEK_SET);//position of channel
    fread(&numberChannels, sizeof(word), 1, pFile);
    fseek(pFile, 34, SEEK_SET);//position of bitsPerSample
    fread(&bitsPerSample, sizeof(word), 1, pFile);
    count = numberChannels * bitsPerSample;
    rewind(pFile);
    fread(head, sizeof(head), 1, pFile);
    pOutFile = fopen (array[3] ,"w");
    fwrite(head, sizeof(head), 1, pOutFile);
    count = count/8;//in my example count = 32 so count =4
    rev = (byte*)malloc(sizeof(byte) * count);//byte = unsigned char
    fseek(pFile, -count, SEEK_END);
    for(i=0; i<10 ; i++)
    {
        fread(rev, count, 1, pFile);
        fwrite(rev, count, 1, pOutFile);
        fseek(pFile, -count, SEEK_CUR);     
    }
    fclose(pFile);
    fclose(pOutFile);
}
4

3 回答 3

1

sizeof(rev)将评估为指针的大小。您可能只想count改用。

另外,这条线是否count = count + count按照您的意愿进行操作?(即count每次迭代都会翻倍)

于 2013-06-28T16:05:16.897 回答
1

我会将您的 fseek 更改为从当前位置相对移动(并使用 count 而不是sizeof(rev)):

for(i=0; i<10; i++)
{
    fread(rev, count, 1, pFile);
    fwrite(rev, count, 1, pOutFile);
    fseek(pFile, -count, SEEK_CUR);
}
于 2013-06-28T16:10:21.103 回答
0

您需要将 count 初始化为 4 并逐步添加 4。此外,sizeof(rev)只是指针的大小(4/8 字节)。你需要sizeof(byte) * count改用。您也可以直接在 for 中使用 count :

pFile = fopen(array[2] ,"r");
pOutFile = fopen(array[3] ,"w");
rev = (byte*)malloc(sizeof(byte) * count); //byte = unsigned char
for(count = 4; count < 44; count += 4)
{
    fseek(pFile, -count, SEEK_END);
    fread(rev, sizeof(byte), count, pFile);
    fwrite(rev, sizeof(byte), count, pOutFile);
}
fclose(pFile);
fclose(pOutFile);
于 2013-06-28T16:03:24.667 回答