Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何将链表写入文件_C_Linked List_Text Files - Fatal编程技术网

C 如何将链表写入文件

C 如何将链表写入文件,c,linked-list,text-files,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; prod

我是一名新的程序员,在将链接列表写入文本文件时遇到了一些问题。 这是我的密码:

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()和其他函数向文件写入一个简单的整数,但它会输出随机数。 如果您想知道,因为我没有在这里复制整个代码,所以列表不是空的,我可以正确显示其中的所有项目。
如果我不清楚,我很抱歉,但这是我在这里的第一篇帖子。希望有人能帮助我,谢谢

fwrite
只写入数据的二进制表示形式,而不是您可能希望在文本文件中看到的ASCII表示形式。例如,一个整数将由四个
NUL
字符表示,这是您无法看到的。因此,您的代码可能会正常工作

如果要将某些内容作为文本写出,请使用
fprintf
,例如:

fprintf(fp, "%d,%d,%lf,\"%s\"\n",
        iterator->code, iterator->items, iterator->price, iterator->name);
将是CSV的粗略近似值(注意,它不会在名称中转义字符)


顺便问一下,为什么不让add作为
产品的
节点的成员变量呢?然后,您可以避免所有的复制。

我建议进行以下更改:

  • 将每个节点的
    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;
    
  • 现在,写入链接列表内容的函数可以是:

    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;
    }
    

  • 这是你的决定,怎么写?你应该决定…我的意思是使用fwrite一次写入整个结构,并保持与上一个文件相同的“顺序”,在该文件中,数据创建链接列表。但是它不起作用。如何检查文件中的内容?毫不奇怪,字符串不在其中,但数字应该在其中。如果您希望文件是可读文本,那么您需要在每个字段之间单独写入一些分隔符,如空格、换行符、,等等。如果你要像你所展示的那样将整个结构作为一个二进制块来编写,那么你应该以二进制模式打开文件。如果你在读回文件时遇到困难,你也应该包含该代码。一个简单的例子,填写一个节点,写下它,然后读回它,应该足以解决问题了?关于第二个建议,您的意思是:typedef struct N{product P;struct N*next;}node_t?要以文本形式写出,请使用
    fprintf
    (请参见编辑)。是的,正是这样。恐怕我不明白为什么获取链表的大小并将其作为第一条数据写入很重要。请你给我解释一下好吗?非常感谢你!在从文件读回数据时,这将非常有用。您将知道链接列表中有多少项。您将读取
    for
    循环中与节点对应的数据,并且读取的数据不会比您需要的多或少。当然,您可以通过EOF判断您已经到达了文件的末尾。