2013-06-28 132 views
0

你好,我想要做的是扭轉一個二進制文件。例如,如果通道號是2,每個樣本的位數是16,則每次我將複製32/8 = 4個字節時,文件的類型都是wav。第一個想要做的就是複製標題(這部分是可以的),然後反轉他的數據。我已經創建了一個代碼來複制標題,然後從最後10次結束部分數據(用於測試),但不是複製40個字節,而是由於某種原因停止在20(即使它會做20次它會仍然只複製20個字節)。這是這樣做的代碼。我不能看出錯誤了,如果你能看到它告訴我:)也許錯誤是別的地方,所以我寫的全功能fread fwrite fseek in C

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); 
} 

回答

0

需要初始化數爲4,加4到它逐步。另外,sizeof(rev)只是一個指針(4/8字節)的大小。您需要改用sizeof(byte) * 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); 
1

sizeof(rev)將評估指針的大小。您可能只想使用count

此外,行count = count + count做你想要它? (即雙打count每次迭代)

+0

是,這是一個很大的mistake..i做了總和=計數和爲我做總和=總計+計數 –

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); 
} 
+0

這似乎更好,但它並沒有解決問題:/ –

+0

您是否嘗試過使用調試器,如gdb?可能有幫助... –