如何逐字节从文件中读取

6
我想从一个类型为song.wav的二进制文件中读取前4个字节。在.wav文件中,前4个字节必须是52-46-49-49,并且我必须读取它们以后检查它们是否正确。
问题是我在fread行处有一个编译错误,其中说“无效转换从unsigned char到void”,以及“初始化参数1的'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 ;
}

使用 getc() 函数,char 类型始终是一个字节。 - Charan Pai
4个回答

10

这是一个单一的错误:

在初始化参数1时,将unsigned char无效转换为void*

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]);

我已经解决了我的错误,谢谢。但是,我应该得到的数字52-46-49-49被替换成了一些奇怪的符号:S。 - Zisis Diamantis
2
@ZoNiaC,你已经得到了数字。只需使用%d而不是%c进行打印即可。 - Elazar

5
为了精确地读取一个字节并将其存储到索引为i的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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接