【发布时间】:2021-02-13 05:17:21
【问题描述】:
我正在处理一项作业,该作业将获取一个包含配方的文件并创建一个结构实例来存储信息。这是我的结构遵循的格式:
struct Dinner
{
char* recipeName;
unsigned numMainDishIngredients;
char** mainDishIngredients;
unsigned numDessertIngredients;
char** DessertIngredients;
};
我需要弄清楚如何在文件中使用读取,该文件的结构如下: 第一行将包含食谱的名称,第二行将是主菜中成分的数量,然后下一行将包含主菜中的一种成分,直到一个空白行被击中。空行之后的行将包含甜点中成分的数量,以下各行将包含甜点成分。
一个例子如下:
Pizza and Ice Cream
4
Dough
Cheese
Sauce
Toppings
3
Cream
Sugar
Vanilla
我主要不确定如何读入 char** 类型。到目前为止,这就是我所拥有的:
struct Dinner* readRecipe(const char* recipeFile)
if (!recipeFile)
{
return NULL;
}
File* file = fopen(recipeFile, "r");
if (!file)
{
return NULL;
}
char recipeName[50]; // specified that strings wont exceed 49 chars
int numMainIngredients, numDessertIngredients;
fscanf(file, "%s, %d", &recipeName, numMainIngredients);
...
}
基本上我不知道如何将文件的多行读取到结构中的数组类型中,我非常感谢有关如何做到这一点的任何提示。
【问题讨论】:
-
这个作业之前一定尝试过教你一些东西。它以前如何?是否可能涉及内存分配和
malloc、calloc、realloc和free等函数?见en.cppreference.com/w/c/memory -
是的,我们应该在分配中使用 malloc 或 calloc 以及 free,但我最困惑的是如何在使用 fscanf 的同时分配内存。
-
一种选择是将行读入一个临时变量,如
char ingredient[32],然后用char *p = malloc(strlen(ingredient) + 1); strcpy(p, ingredient);复制它。 -
另一种选择是分配比您需要的更多。如果最大长度为 50,则分配 51(始终记住字符串的尾随 '\0'。
-
删除
fscanf()。用fgets()读取一行,然后解析该行。
标签: c file struct scanf readfile