如何将链接列表写入文件

时间:2015-01-19 21:39:26

标签: c linked-list text-files

我是一名新程序员,我在编写链接列表到文本文件时遇到了一些麻烦。 这是我的代码:

typedef struct N {
  int code;
  char name[MAX1];
  int items;
  float price;
  struct N *next;
} node_t;

typedef struct {
  int code;
  char name[MAX1];
  int items;
  float price;
} product;

product p;
product *ptr = &p;
node_t *iterator = head;
FILE *fp;
fp = fopen("newfile.txt", "w+");


while (iterator != NULL) {
   p.code = iterator->code;
   strcpy(p.name, iterator->name);
   p.items = iterator->items;
   p.price = iterator->price;
   fwrite(ptr, 1, sizeof(product),fp);
   iterator = iterator->next;
}

此时,我从流中读取并显示我应该写在" newfile.txt"上的内容,但所有打印出来的都是' 0'哪里应该有一个整数/浮点数,什么都不应该有一个字符串。 我也尝试用fputs()和其他函数写一个简单的整数文件,但它打印出随机数。 如果你想知道,因为我还没有在这里复制整个代码,列表不是空的,我可以正确显示其中的所有项目。 对不起,如果我还不清楚,这是我在这里发表的第一篇文章。希望有人能帮助我,谢谢!

2 个答案:

答案 0 :(得分:1)

fwrite只是写出数据的二进制表示,而不是像您希望在文本文件中看到的ASCII表示。例如,一个整数将由四个NUL个字符表示,您将无法看到它们。所以你的代码可能正常工作。

如果您想以文字写出来,请使用fprintf,例如:

fprintf(fp, "%d,%d,%lf,\"%s\"\n",
        iterator->code, iterator->items, iterator->price, iterator->name);

将是CSV的粗略近似值(请注意,它不会转义名称中的字符)。

顺便说一下,为什么不添加node_t product的成员变量呢?然后你可以避免所有复制。

答案 1 :(得分:0)

我建议进行以下更改:

  1. 将每个节点的struct划分为两个struct s - 一个用于保存数据,另一个用于捕获下一个指针。

    typedef struct 
    {
      int code;
      char name[MAX1];
      int items;
      float price;
    } NodeData;
    
    typedef struct N {
       NodeData data;
      struct N *next;
    } node_t;
    
  2. 现在编写链表内容的功能可以是:

    fp = fopen("newfile.txt", "w+");
    
    // Get the size of the linked list and write as the first piece of data.
    size_t listSize = getLinkedListSize(head)
    
    fwrite(&listSize, 1, sizeof(size_t), fp);
    
    // Now write each node of the linked list.
    while (iterator != NULL) {
       fwrite(&(iterator->data), 1, sizeof(iterator->data), fp);
       iterator = iterator->next;
    }