gpt4 book ai didi

c - 从二进制文件读取数据到C中的链表(访问违规读取位置)

转载 作者:太空宇宙 更新时间:2023-11-04 01:32:17 26 4
gpt4 key购买 nike

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

感觉我快要疯了,我花了大约 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;

嗯,它正在尝试成为一个链表。以下是我尝试从文件中读取数据并将其放入结构中的方法:

{
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行这样的。

因此,如果我运行它,则会收到错误“访问违规读取位置”。请帮助我该怎么做,在类里面我们没有做过这样的事情,但他们仍然想要它。

最佳答案

这里似乎有几个问题。

一:

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(...) 函数。

关于c - 从二进制文件读取数据到C中的链表(访问违规读取位置),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20576671/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com