如何从文件中逐字节读取

时间:2013-06-28 10:00:14

标签: c

我想从binnary文件读取4个第一个字节,这是一个song.wav类型。在.wav文件中,4个第一个字节必须是52-46-49-49,我必须阅读它们以便稍后检查它们是否为真。

问题是我在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 ;
}

4 个答案:

答案 0 :(得分:10)

这是一个错误:

  

unsigned charvoid*初始化

的参数1的转换无效
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]);

答案 1 :(得分:5)

为了准确读取一个字节并将其存储在索引k的{​​{1}}中,您需要提供元素i的地址

i

但是,如果你对它们感兴趣,你宁愿一次读取整个4个字节。所以根本没有for(i=0; i<4; i++){ fread(&k[i],1,1,myfile); } 循环,只是这样做:

for

在失败的情况下,测试fread(k,1,4,myfile); 的返回码(以及任何I / O操作)也是一种好习惯。 fread了解更多信息。

答案 2 :(得分:4)

您可以只使用

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

答案 3 :(得分: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;
}