6

我想从一个 song.wav 类型的二进制文件中读取前 4 个字节。在 .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

4 回答 4

10

这是一个错误:

unsigned char从到void*初始化参数 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]);
于 2013-06-28T10:06:51.403 回答
5

为了准确读取一个字节并将其存储到k索引处i,您需要提供元素 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了解更多信息。

于 2013-06-28T10:07:21.873 回答
4

你可以只使用

char buffer[4];
fread(buffer,1,4,myfile);
于 2013-06-28T10:58:38.710 回答
0

你不需要使用fread()Even the fgetc()works well。简单的编码。就像读取文本文件一样简单。

#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;
}
于 2015-10-07T07:53:01.663 回答