【发布时间】:2016-12-15 14:20:48
【问题描述】:
大家好,很抱歉询问,但我可以找到任何合适的解决方案。 我正在研究一个文件系统,我将每个文件节点作为键值对保存在 GDBM 数据库中。 我有一个具有一些属性的结构,我将其转换为字节数组
结构 mystruct:
typedef struct nold{
char* name;
char* surname;
int age;
}mystruct;
我将其转换为字节数组
dead.name="john";
dead.surname="doe";
dead.age=22;
//copy bytes of the our struct
char buffer[sizeof(dead)];
memcpy(buffer, &dead, sizeof(dead));
要在数据库中存储,我们使用如下数据结构:
typedef struct {
char *dptr;
int dsize;
} datum
我填写的数据结构如下:
//create a key datum
char* k="file.txt";
key.dptr=k;
key.dsize=strlen(k)+1;
//create a value datum here I assign bytes
value.dptr=buffer;
value.dsize = sizeof(dead);
现在我以键值对的形式存储在 GDBM 中
然后在另一个文件中读取我存储的数据并尝试将其重铸回结构
datum result;
//read
result=gdbm_fetch(file,key);
char* bytes=result.dptr;
mystruct* reborn;
reborn=(mystruct*)bytes;
//print from our new struct
printf("%s\n",reborn->name);
printf("%s\n",reborn->surname);
printf("%d\n",reborn->age);
它打印以下内容:
E���D$�$ˈ�k����E��
$�$ˈ�k����E��
22
它设法恢复结构,但 char* 的数据丢失了。仅涵盖整数数据。知道为什么会这样吗?如何解决?它不能通过存储字节数组来解决,如何将字节数组转换为十六进制或base64并存储它。
我真的很努力解决这个问题。提前谢谢你。
【问题讨论】:
-
您不能将指针值写入文件并期望它工作。
-
我写的原始数据是怎么回事。
-
这很重要。在您的示例中,
dead实际上并不包含字符串"John"和"Doe",而仅包含指向这些字符串的指针。所以如果你写dead的原始数据,你只写指针的值而不是字符串本身。 -
指针不是数组!
-
那么预分配内存可以解决这个问题吗?
标签: c arrays struct filesystems gdbm