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

标签 c struct segmentation-fault malloc fread

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

关于c - 从文件读取数据到结构体中 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37671128/

相关文章:

c++ - 奇怪的段错误

linux - Linux 中的 NASM 代码出现段错误

c - 为什么第二个 printf 打印垃圾值

c - 如何在 C 中创建字符串数组?

swift - 结构等价? typealias 是执行此操作的 "Swift"方法吗?

c# - 将结构值分配给此关键字

c - 如何用零初始化结构的数组字段

c - strcpy 周围的段错误?

c - 如何将字符指针分配给字符变量?

c - 指针未以所需方式打印