2013-06-28 169 views
6

我想从一个歌曲类型的二进制文件中读取4个第一个字节。在.wav文件中,4个第一个字节必须是52-46-49-49,我必须阅读它们才能稍后检查它们是否为真。如何从一个文件中逐字节地读取

事情是,我有一个编译arror在fread行说invalid conversion from "unsigned char" to "void"initialzing argument 1 of 'size_t fread(void*,size_t,size_t,FILE*),我不知道它是什么意思。

我在前面的话题中看到,这是fread必须完成的方式,如果我想逐字节读取。如果任何人有任何想法,我可以逐字节读取并将它们存储在一个很好的数组中。谢谢。

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

使用'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返回代码(以及与此有关的任何I/O操作)。 man fread欲了解更多信息。

4

只需使用

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

你不需要使用fread()就连fgetc()效果很好。简单的编码。像阅读文本文件一样。

#include <stdio.h> 

int main(int argc, char** argv) 
{ 
    FILE* f = fopen("lak", "rb"); 
    fseek(f,0,SEEK_END); 
    long lsize=0,i=0; 
    lsize = ftell(f); 
    rewind(f); 

    while(i<lsize){ 
     int first = fgetc(f); 
     i++; 
     printf("first byte = %x\n", (unsigned)first); //you can do anything with 
                 //first now 
    } 

fclose(f); 

return 0; 
}