从文件中读取各种形式的数据并将它们存储在C中的链表中

时间:2015-07-15 22:38:01

标签: c linked-list stack

我没有看到任何类似的东西,所以我决定问自己。我试图为我的一个类写一个程序,你从一个文件中读取一组关于杂货项目的数据,然后将它存储在一个堆栈中。

我无法弄清楚如何阅读所有不同的数据类型。

数据格式为:

  

(String)Produce,(String)Type,(String)Sold by [quantity],(float)price,(int)In Stock [quantity]。

我怎样才能阅读这些不同的数据类型并将它们保存到我的产品项目结构中。

struct produce_Item
{
   char produce[20];
   char type[20];
   char sold_By[20];
   float price;
   int quantity_In_Stock;
   struct produce_Item *next;
 }

2 个答案:

答案 0 :(得分:0)

struct produce_Item *list, **newItem = &list;
do
  *newItem = malloc(sizeof(struct produce_Item));
while (*newItem != NULL &&
       5 == fscanf(file, "%19s,%19s,%19s,%f,%d",
                         (*newItem)->produce,
                         (*newItem)->type,
                         (*newItem)->sold_By,
                         &(*newItem)->price,
                         &(*newItem)->quantity_In_Stock)
       && (newItem = &(*newItem)->next));
free(*newItem);
*newItem = NULL;

请注意,这不会处理错误,例如太长的描述,包含空格或数据错误的描述。但如果数据被保证有序,那么这应该有效,如果我没有犯错。

EDIT。它也没有处理内存不足。否则这与chuxs的答案相同,只是稍微难以理解:)

答案 1 :(得分:0)

读取链接列表的典型方法是创建临时头节点并仅使用其.next字段。

#include <stdlib.h>

  ...
  struct produce_Item Head;
  struct produce_Item *p = &Head;
  p->next = NULL;

然后遍历文件。虽然这是另一个步骤,但如果通过首先读取fgets()的行来完成输入,事情会容易得多。然后根据需要使用sscanf()strtok()strtol()等解析该行。扫描成功完成后,为新节点分配内存,将数据保存在其中并前进p

  FILE *file;
  char buf[100];
  while (fgets(buf, sizeof buf, file) != NULL) {
    struct produce_Item Item;
    if (5 != sscanf(buf, "%19s ,%19s ,%19s ,%f ,%d", Item.produce, Item.type,
          Item.sold_By, &Item.price, &Item.quantity_In_Stock)) Handle_BadData();
    Item.next = NULL;
    // At this point, all 6 fields are set.

    struct produce_Item *Next = malloc(sizeof *Next);
    if (Next == NULL) Handle_OOM();  // Out of memory
    *Next = Item; // Copy Item to *Next

    // Advance p
    // Notice that the first time this executes, it set Head.next
    p->next = Next;
    p = Next; 
  }

  return Head.next; // The head of the list