将数据从文件读入结构(C)

将数据从文件读入结构(C),c,struct,segmentation-fault,malloc,fread,C,Struct,Segmentation Fault,Malloc,Fread,很抱歉,如果格式混乱,这是我第一次使用stackoverflow。 我正在尝试使用fread函数以512字节的块读取card.raw文件,并将块的前4个字节存储到s1-s4中,剩余的508字节存储到字节数组中。然而,当我尝试运行这个时,我得到了一个分段错误。当我尝试调试时,调用fread函数后,argv,outptr,inptr,和buf值都变为NULL。为什么会这样?我做错了什么 typedef uint8_t BYTE; //block of 512 bytes typedef stru

很抱歉,如果格式混乱,这是我第一次使用stackoverflow。 我正在尝试使用
fread
函数以512字节的块读取
card.raw
文件,并将块的前4个字节存储到
s1-s4
中,剩余的508字节存储到字节数组中。然而,当我尝试运行这个时,我得到了一个分段错误。当我尝试调试时,调用
fread
函数后,
argv
outptr
inptr
,和
buf
值都变为
NULL
。为什么会这样?我做错了什么

typedef uint8_t  BYTE;

//block of 512 bytes
typedef struct 
{
    BYTE s1;
    BYTE s2;
    BYTE s3;
    BYTE s4;
    BYTE image[508];
}
BUFFER;

int main(int argc, char* argv[])
{
    //opens memory card file
    FILE* inptr = fopen("card.raw", "r");

    int jpgcounter = 0;

    //creates jpg file
    char title[7];
    sprintf(title, "%d.jpg", jpgcounter);
    FILE* outptr = fopen(title, "a");

    //create buf (pointer) of type BUFFER
    BUFFER* buf;

    do
    {
        //creates buffer structure for storage of 512B blocks 
        buf = malloc(sizeof(BUFFER));

        //read 512 bytes at a time & stores every 512B block into a buffer struct buf
        fread(&buf, sizeof(BUFFER), 1, inptr);

        if(buf->s1 == 0xff && buf->s2 == 0xd8 && buf->s3 == 0xff)
        {

if语句用于检查
buf
的前3个元素是否包含以下十六进制签名。我想在循环中使用
malloc
,以便以512字节的结构读取原始文件,决定如何处理512字节,然后继续释放它

使用
fread(buf,sizeof(BUFFER),1,inptr)而不是
fread(&buf,sizeof(BUFFER),1,inptr)
也以二进制模式打开文件以读取,即当您将
&buf
指针而不是
buf
传递到
fread
函数中时,它将不在分配的堆缓冲区中写入数据,而是在函数堆栈中写入数据。由于
x86
平台上的堆栈朝着较低的内存地址增长,这将覆盖堆栈上的所有内容,即
buf
变量之前的内容-在您的示例中是局部变量、函数参数
argc
argv
等以及返回地址。堆栈已损坏,出现分段错误。

是否要将数据读入变量
buf
,或读入
buf
包含指向的指针的内存块?
fread(&buf,sizeof(BUFFER),1,inptr)-->
fread(buf,sizeof(缓冲区),1,inptr)首先将错误检查添加到
fopen()
fread()
。目前,代码在测试访问文件是否有效时不采取任何操作。谢谢!但是为什么要准确地以二进制模式打开文件呢?一些系统可能会以不同的方式处理
“r”
“rb”
模式。例如,行结束可以以不同的方式处理。您的数据似乎是纯二进制的,您不希望系统在读取时对其进行操作,因此以二进制模式打开它是安全的。