gpt4 book ai didi

c - 使用 read 从二进制文件中读取结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:46:27 24 4
gpt4 key购买 nike

我正在用 C 语言对复杂的客户端/服务器(多聊天室)程序执行简单操作。

我有一个名为 node 的链表结构

struct node
{
char *user;
char *passwd;
int id;
int connected;
struct node *next;
};

还有另一个结构叫做room

struct room
{
char *name;
int capacity;
int room_id;
int admin_id;
struct room *next;
struct node *users;
};

我将其声明为全局变量:

struct room *rooms = NULL;

我已经用互斥量和信号量保护了它。

所以我只想在服务器结束时编写这个结构,然后在服务器再次启动时加载它。这样做的逻辑存在于两个文件中,server.c*server_utils.c*,如下所示:

server.c:

int main (void)
{
[...]
struct stat st;
[...]
stat ("rooms.bin", &st);
if (st.st_size > 0)
{
// Load rooms
load_rooms ();
}
else
{
[...]
}
[...]
exit (EXIT_SUCCESS);
}

*server_utils.c*:

[...]

void load_rooms (void)
{
int fd;
if ((fd = open ("rooms.bin", O_RDONLY)) < 0)
{
perror ("open");
exit (EXIT_FAILURE);
}
else
{
read (fd, &rooms, sizeof (rooms));
}
}

void save_rooms (void)
{
int fd;
if ((fd = open ("rooms.bin", O_WRONLY | O_CREAT | O_TRUNC, 0644)) < 0)
{
perror ("open");
exit (EXIT_FAILURE);
}
else
{
write (fd, &rooms, sizeof (rooms));
}
}

[...]

我发现的问题是,当我从二进制文件中读取结构时

read (fd, &rooms, sizeof (rooms));

然后我尝试打印结构

void rooms_linkedlist_print (struct room *head)
{
struct room *curr = head;
char str[1024];
while (curr != NULL)
{
write (1, curr->name, strlen (curr->name));
write (1, "\n", strlen ("\n"));
bzero (str, 1024);
sprintf (str, "%d\n", curr->capacity);
write (1, str, strlen (str));
bzero (str, 1024);
sprintf (str, "%d\n", curr->room_id);
write (1, str, strlen (str));
bzero (str, 1024);
sprintf (str, "%d\n", curr->admin_id);
write (1, str, strlen (str));
curr = curr->next;
}
}

我遇到了段错误(核心已转储)。对我做错了什么有什么想法吗?

最佳答案

你的房间结构里面有指针。

当您重新加载数据时,这些指针将不再一定指向分配的内存,从而导致段错误。

您可以通过从使用指针更改为使用房间数组的索引来解决此问题。

关于c - 使用 read 从二进制文件中读取结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515927/

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