2013-06-28 2 views
0

Привет, что я пытаюсь сделать, это изменить двоичный файл. Тип файла - wav, например, если номер канала равен 2, а бит на выборку - 16 каждый раз, когда я буду копировать 32/8 = 4 байта. Первое, что нужно сделать, это скопировать заголовок, как есть (эта часть в порядке), а затем изменить его данные. Я создал код для копирования заголовка, а затем часть данных с конца в 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 сделал sum = count и in for i do sum = sum + count –

1

Я хотел бы изменить свой FSEEK двигаться относительно от текущей позиции (и использовать подсчет вместо 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

Вы пытались использовать debugguer, например gdb? Может помочь... –