2013-06-28 6 views
6

Я хочу прочитать 4 первых байта из бинарного файла, который является типом song.wav. В .wav-файле 4 первых байта должны быть 52-46-49-49, и я должен их прочитать, чтобы проверить позже, если они верны.Как читать byte by byte из файла

Дело в том, что у меня есть компилятор на линии прохода, в котором говорится: invalid conversion from "unsigned char" to "void" и initialzing argument 1 of 'size_t fread(void*,size_t,size_t,FILE*), и я не знаю, что это значит.

В предыдущем разделе я видел, как это делается, если нужно читать байт по байту. Если кто-нибудь знает, как я могу читать байты по байтам и хранить их в массиве, который будет большим. Спасибо.

void checksong(char *argv[]){ 
    FILE *myfile; 
    int i; 
    unsigned char k[4]; 
    myfile=fopen(argv[2],"r"); 
    i=0; 
    for(i=0; i<4; i++){ 
     fread(k[i],1,1,myfile); 
    } 
    for(i=0; i<4; i++){ 
     printf("%c\n", k[i]); 
    }         
    return ; 
} 
+0

use 'getc()' 'char' всегда байт. –

ответ

10

Это одна ошибка:

Invalid conversion from unsigned char to void* initializing argument 1 of

size_t fread(void*,size_t,size_t,FILE*) 

Это означает, что k[i] является unsigned char, а не указатель. Вы должны использовать &k[i] или k+i.

Однако вам не нужно читать байт по байт. Вы можете прочитать 4 байта, нет петли не участвуют:

fread(k, 4, 1, myfile); 

Печать номера:

for (i=0; i<4; i++) 
    printf("%d\n", k[i]); 
+0

Я сделал это, и он исправил мою ошибку, спасибо. Но вместо цифр 52-46-49-49 я должен получить некоторые странные символы: S –

+1

@ZoNiaC Вы получаете цифры. просто распечатайте их, используя% d, а не% c. – Elazar

5

Для того, чтобы прочитать ровно один байт и сохранить его в k по индексу i, вам необходимо предоставить адрес элемента я

for(i=0; i<4; i++){ 
    fread(&k[i],1,1,myfile); 
} 

Однако, вы бы лучше прочитать целые 4 байта за один раз, если вы не заинтересованы в них 4. Так нет for петли вообще, и просто сделать:

fread(k,1,4,myfile); 

Это также хорошая практика, чтобы проверить код возврата fread (и любые операции ввода/вывода по этому вопросу) в случае, если она не сможет. man fread для получения дополнительной информации.

4

Вы можете использовать только

char buffer[4]; 
fread(buffer,1,4,myfile); 
0

вам не нужно использовать fread() Даже fgetc() работает хорошо. Простое кодирование. SImple как чтение текстового файла.