C 如何从文件中逐字节读取

C 如何从文件中逐字节读取,c,C,我想从一个二进制文件(song.wav类型)中读取前4个字节。在.wav文件中,前4个字节必须是52-46-49-49,我必须读取它们以稍后检查它们是否为真 问题是,我在fread行有一个compile arror,它说从“unsigned char”到“void”的无效转换和初始化'size\t fread(void*,size\t,size\t,FILE*)的参数1,我不知道这是什么意思 我在前面的一个主题中看到,如果我想一个字节一个字节地读取,必须这样做。如果有人知道如何逐字节读取数据并将

我想从一个二进制文件(song.wav类型)中读取前4个字节。在.wav文件中,前4个字节必须是52-46-49-49,我必须读取它们以稍后检查它们是否为真

问题是,我在fread行有一个compile arror,它说
从“unsigned char”到“void”的无效转换
初始化'size\t fread(void*,size\t,size\t,FILE*)
的参数1,我不知道这是什么意思

我在前面的一个主题中看到,如果我想一个字节一个字节地读取,必须这样做。如果有人知道如何逐字节读取数据并将其存储在数组中,那就太棒了。多谢各位

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 ;
}
void checksong(char*argv[]{
文件*myfile;
int i;
无符号字符k[4];
myfile=fopen(argv[2],“r”);
i=0;
对于(i=0;i而言,这是一个单一错误:

unsigned char
void*
的无效转换初始化的参数1

size_t fread(void*,size_t,size_t,FILE*)
这意味着
k[i]
是一个
无符号字符
,而不是指针。您应该使用
&k[i]
k+i

但是,您实际上不需要逐字节读取。您可以读取4个字节,不涉及循环:

fread(k, 4, 1, myfile);
打印号码:

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

对于(i=0;i为了准确读取一个字节并将其存储到索引
i
处的
k
,您需要提供元素i的地址

for(i=0; i<4; i++){
    fread(&k[i],1,1,myfile);
}
测试
fread
的返回代码(以及任何与此相关的I/O操作)以防失败也是一种很好的做法。
man-fread
了解更多信息。

您可以使用

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

您不需要使用
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;
}
#包括
int main(int argc,字符**argv)
{
文件*f=fopen(“lak”、“rb”);
fseek(f,0,SEEK_END);
长lsize=0,i=0;
lsize=ftell(f);
倒带(f);

虽然(iuse
getc()
char
始终是一个字节。我这样做了,它修复了我的错误,谢谢。但是我得到的不是我应该得到的数字52-46-49-49,而是一些奇怪的符号:S@ZoNiaC您可以得到数字。只需使用%d而不是%c打印即可。
#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;
}