使用fread/fwrite在C中读写文件的结构
我有以下结构:使用fread/fwrite在C中读写文件的结构,c,struct,fwrite,structure,fread,C,Struct,Fwrite,Structure,Fread,我有以下结构: typedef struct { char last[NAMESIZE]; char first[NAMESIZE]; } name; typedef struct { int id; name name; float score; } record; typedef struct { record *data; size_t nalloc; size_t nused; } record_list; 我正在尝试使用此函数从文件中读取记录: i
typedef struct {
char last[NAMESIZE];
char first[NAMESIZE];
} name;
typedef struct {
int id;
name name;
float score;
} record;
typedef struct {
record *data;
size_t nalloc;
size_t nused;
} record_list;
我正在尝试使用此函数从文件中读取记录:
int file_read(record_list *list, record* rec)
{
/* irrelevant code eliminated */
while(fread(&records, sizeof(record), 1, fp))
{
*rec = records;
valid_list_insert = list_insert(list, rec);
if(!valid_list_insert)
{
return 0;
}
}
}
我正在尝试使用以下函数将记录列表写入文件:
int file_write(record_list* list)
{
/* irrelevant code eliminated */
if(fwrite(&list, sizeof(record_list), 1, fp) == 0)
{
return 0;
}
}
但是,这两种方法都不能正常工作。当我试图在程序中显示记录列表时,fread以随机的方式读取数据。而fwrite只是将随机字符写入文件。如果您能帮我解释一下为什么这不起作用,我们将不胜感激 好的,不起作用的一件事是写入指针(如
记录列表的数据成员中的指针):因为(1)它将写入指针的值(即内存中某个点的数值)和(b)当您再次读取时,您不会将您的内容分配到相同的位置。相反,您必须仔细解析结构,并以能够再次获取数据的方式记录数据
此过程称为“序列化”(反之称为“反序列化”)。另请参见。好吧,不起作用的一件事是写入指针(如记录列表的数据成员):因为(1)它将写入指针的值(即内存中某个点的数值)和(b)当您再次读回指针时,您不会在同一位置分配您的内容。相反,您必须仔细解析结构,并以能够再次获取数据的方式记录数据
此过程称为“序列化”(反之称为“反序列化”)。另请参见。如果您认为问题出在fread
/fwrite
,那么首先要做的就是消除所有不相关的代码,让您的生活更轻松,让您的问题更容易被人回答。因此,摆脱所有与解析用户输入有关的东西!让gdb成为你的朋友。一次性投资(学习曲线),你将在一生中不断收获!如果你认为问题出在fread
/fwrite
上,那么首先要做的就是消除所有不相关的代码,让你的生活更轻松,让别人更容易回答你的问题。因此,摆脱所有与解析用户输入有关的东西!让gdb成为你的朋友。一次性投资(学习曲线),你将在一生中不断收获!我一直在看fread和fwrite的示例,它们似乎都以与我相同的方式使用函数。我对C还是很陌生,你能给我一个在我尝试做的事情中使用序列化的例子吗?首先看看你是否可以简单地在typedef struct{int I;char s[8]}dumbstruct代码>。如果这样做有效,请考虑如何序列化dumbstruct
s:typedef struct node\u t{node\u t*next;dumbstruct payload;}node代码>。这里的关键问题是“如何表示结构(指针中编码的列表)以及数据?”我一直在查看fread和fwrite的示例,它们似乎都以与我相同的方式使用函数。我对C还是很陌生,你能给我一个在我尝试做的事情中使用序列化的例子吗?首先看看你是否可以简单地在typedef struct{int I;char s[8]}dumbstruct代码>。如果这样做有效,请考虑如何序列化dumbstruct
s:typedef struct node\u t{node\u t*next;dumbstruct payload;}node代码>。这里的关键问题是“如何表示结构(指针中编码的列表)以及数据?”