将文件读入结构 C

Posted

技术标签:

【中文标题】将文件读入结构 C【英文标题】:Reading a file into a struct C 【发布时间】: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);

...


基本上我不知道如何将文件的多行读取到结构中的数组类型中,我非常感谢有关如何做到这一点的任何提示。

【问题讨论】:

这个作业之前一定尝试过教你一些东西。它以前如何?是否可能涉及内存分配和malloccallocreallocfree 等函数?见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() 读取一行,然后解析该行。 【参考方案1】:

从文件中读取非常简单。大多数 std 函数旨在从文件中读取一行,然后自动移动到下一行。所以你真正需要做的就是循环。

我建议你写如下

#define MAXCHAR 256
char[MAXCHAR] line;
while(fgets(line, MAXCHAR, file) != NULL)

  // line now has the next line in the file
  // do something with it. store it away
  // use atoi() for get the number?
  // whatever you need.

即我们使用fgets()来抓取文件的下一行;如果我们循环那一堆;它将一直读取到文件结束 (EOF)。

请注意,我使用了fgets() 而不是fscanf()fgets() 是比 fscanf 更安全、更高效的选择。当然,它没有指定行格式等的花哨的能力;不过自己做也不是太难。

编辑:我把我的语言搞混了。。修复了它。

【讨论】:

以上是关于将文件读入结构 C的主要内容,如果未能解决你的问题,请参考以下文章

将二进制文件读入结构

c语言如何从文件读入,并存放在链表中

c语言如何将文件数据读入链表?用fread

ply格式文件,用C语言怎么读入,并存储在哪种数据结构中

数据结构中哈夫曼树的应用(C语言)

将多个 CSV 文件读入单独的数据帧