将二进制文件中的数据读取到C中的链接列表中(访问冲突读取位置)

数码琴

编辑了代码,现在我在读取文件时遇到了问题。我的结构没有得到值。

感觉就像我快要疯了,我正在努力寻找解决办法,大概需要8个小时...所以这是我的结构

typedef struct _megye
{ 
    int megye;
    int hektar1_min;
    int hektar1_max;
    int hektar1_tam;
    int hektar2_min;
    int hektar2_max;
    int hektar2_tam;
    int hektar3_min;
    int hektar3_tam;
    struct _megye *next;
}megye;

好吧,它正在尝试成为一个链表。这是我尝试从文件中读取数据并将其放入struct中的方法:

{
    FILE *fb;
    megye*p;
    megye *mhead;
    mhead=(megye*)malloc(sizeof(megye));
    p=mhead;
    fb=fopen("tamogatas.dat", "rb");

    if (fread(p, 3, 7, fb) != 7)
    {
        printf("there was an error");
    }
    else
    {
        p=p->next;
        p=(megye*)malloc(sizeof(megye));
        p->next=NULL;
    }
    fclose(fb);
    return 0;
}

顺便说一下,我的文件看起来像这样:

1 50 100 2 100 200 4 200 6

这种类型的7行。

因此,如果我运行此命令,则会收到错误“ Acces违规读取位置”。请帮我做什么,在课堂上我们还没有做过这样的事情,但他们仍然想要这样做。

Dweeberly

这里似乎有几个问题。

一:

FILE *fb;
megye*p;
mhead=p=(megye*)malloc(sizeof(megye));

fb=fopen("tamogatas.dat", "rb");

if (fread(p, sizeof(megye), 7, fb) != 7)

我建议您避免使用a = b = c ...语法。它可能会导致细微的错误,并且在阅读时很容易遗漏。但是,真正的问题是您期望fread在这里做什么。您的数据文件是二进制文件吗?如果没有,您将无法获得期望。如果是,则期望它读取所有7个二进制结构值,并将它们存储在仅分配给一个这样的结构的内存位置中。几乎可以肯定这不是您想要做的。

{
    printf("there was an error");
}
else
{
    p=p->next=(megye*)malloc(sizeof(megye));
    p->next=NULL;
}
fclose(fb);
return 0;

在您的else子句中,您将分配另一个结构位置,并将p和p-> next都设置为等于该位置。然后将p-> next设置为NULL。同样,这几乎肯定不是您想要执行的操作。

要形成一个链表,您需要一个指向NULL(空列表)或另一个节点的头。每个节点都有一个下一个字段,该字段指向NULL(列表结尾)或列表中的下一个节点。每个节点应单独分配,每次读取应仅读取该节点(格式正确)。我猜您的输入文件为文本,因此您需要将每个数字转换为二进制值。一种方法是使用标准的fscanf(...)函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章