将数据从文件读取到结构体 (C) 中



抱歉,如果这种格式很混乱,这是我第一次使用stackoverflow。我正在尝试使用 fread 函数以 512 字节的块读取card.raw文件,并将块的前 4 个字节存储到 s1-s4 中,将剩余的其他 508 字节存储到字节数组中。但是,当我尝试运行它时,我遇到了分段错误。当我尝试调试时,调用fread函数后,argvoutptrinptrbuf值都变成了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); 也以二进制模式打开文件进行读取,即 "rb"而不是"r"

当您将指针而不是buf传递到fread函数中时&buf它将不将数据写入分配的堆缓冲区,而是写入函数堆栈。由于x86平台上的堆栈向较低的内存地址增长,这将覆盖堆栈上的所有内容,即在buf变量之前 - 在您的情况下,局部变量,函数参数argcargv等和返回地址。堆栈已损坏,并且出现分段错误。

相关内容

  • 没有找到相关文章

最新更新