【发布时间】:2018-07-05 16:28:20
【问题描述】:
我有这个结构
struct _recipe
{
char name[50];
char** ingredients;
char diff[12];
int time;
int calories;
char** procedure;
} recipe;
我想复制二进制文件中的所有数据。 首先,我已经为成分和程序动态分配了内存,并且我已经编写了我需要的所有内容。但是我需要将所有内容都写在一个二进制文件中。我知道它们都是指针,所以这意味着如果我使用
fwrite(&recipe,sizeof(recipe),1,fbr);
我将在文件中写入地址,而不是我需要的实际值。我已经尝试以这种方式在文件中编写结构的每个字段
fwrite(recipe.name,sizeof(recipe.name),1,fbr);
fgets(recipe.ingredients[j],30,stdin);
strcpy(buff,recipe.ingredients[j]);
len = strlen(buff);
fwrite(buff,sizeof(recipe.ingredients[0]),len,fbr);
fwrite(recipe.diff,sizeof(recipe.diff),1,fbr);
fwrite(&recipe.time,sizeof(recipe.time),1,fbr);
fwrite(&recipe.calories,sizeof(recipe.calories),1,fbr);
fgets(recipe.procedure[i],1000,stdin);
strcpy(buff,recipe.procedure[i]);
len = strlen(buff);
fwrite(buff,sizeof(recipe.procedure[0]),len,fbr);
我不确定这是否正确,但我尝试将字符串放入另一个字符串,然后将其复制到文件中。问题是,我不确定它是否有效,因为我不知道应该使用什么样的命令来读取我存储的所有值。当然,它的名称有效,我对此没有任何问题,但是当我要阅读成分时,我阻止了自己,因为我将值写在另一个字符串中并且我不知道我应该输入什么长度阅读。也许我错过了一些东西,也许我一开始就在写东西,但我现在不知道该怎么办。
【问题讨论】:
-
您可以使用诸如 linux 命令
od -c之类的实用程序查看文件的内容。对于成分,您需要更改sizeof运算符,因为它不会告诉您成分字符串有多大。您可能想写出整个字符串加上一个空终止符,以便知道下一个成分何时开始。与procedure字段相同。您还应该寻找有关编组和解组数据结构的帖子。 -
@bruceg 由于我没有 linux,我想我无法阅读它们,除非我在程序中打开它们。反正写行会变成这样?
fwrite(buff,sizeof(buff),1,fbr)?对不起,我对此有点困惑,还有阅读程序 -
如果你使用的是windows,你可以安装
cygwin并获得酷炫的linux工具。考虑您的电话fwrite(buff,sizeof(recipe.ingredients[0]),len,fbr);。您将写出 len 个元素,其中 len 是 strlen 的结果。这意味着,您还没有写出空终止符。您还想写出每种成分,而不仅仅是第一种。你如何在你的结构中说明有多少成分或程序? -
@bruceg 所以我应该写
fwrite(buff, sizeof(recipe ingredients[i], len,fbr)其中 len 是 strlen 加上空终止符? -
是的。这对我来说似乎是正确的。这样,您将写出空终止符。然后当你读回你的文件时,你可以通过空终止符来告诉每个成分或程序的结束。另外,我有点误读了您的代码。您的变量 buff 是适合循环的成分或程序。
标签: c struct binaryfiles dynamic-arrays