1

好的,这是我的代码的编辑版本以及创建列表的函数。start 被初始化为一个全局变量并且 start=NULL。我也改变了我的fwrite。我没有枚举一长串变量,而是使用 buf 来获取其内容(即名称、标题、类型...)。mygets 只是我创建的一个函数,用于删除后面的 \n。出现同样的问题。外国符号出来了。

void saving()
    {
            FILE *out;
            struct node buf;
            struct node *current;

            out = fopen("foo", "wb");
            if(out == NULL) return;

            printf("Writing to file...");

            while(current != NULL)
            {

                   fwrite(&buf, sizeof(struct node), 1, out);
            }

            printf("Done!\n");
            fclose(out);
    }



void create()
{
node *p,*q;
int item;
char ti[STRLEN],na[STRLEN],ty[6];

printf("Warrior name: ");
mygets(na);

printf("\nWarrior title: ");
mygets(ti);

printf("\nWarrior Type and Class Encoding: ");
fgets(ty,6,stdin);

p=(node *)malloc(sizeof(node));

strcpy(p->name,na);
strcpy(p->title,ti);
strcpy(p->type,ty);

p->next=NULL;
if(start==NULL)
{
start=p;
}
else
{
q=start;
while(q->next!=NULL)
{
q=q->next;
}
q->next=p;
}       

}

4

3 回答 3

2

正如Baldrick在他的评论中指出的那样,您没有分配current给链表的开始/头节点。

你正在做的方式,取消引用一个未初始化的指针,可能会导致你的程序崩溃,幸运的是它对你来说不是这样。

利用:

struct node *current = head;    // Or whatever is your head node name

顺便说一句,如果您编写二进制文件,最好不要将其命名为foo.txt,使用.bin.dat等二进制扩展名,或者最好不要使用任何扩展名。

于 2013-10-14T08:26:21.877 回答
0

为了成功地将链表保存到文件中,必须从第一个节点(头节点)开始并继续移动到其他节点直到最后一个节点。在您的代码中,您没有将 *current 初始化为 Head 节点。

您应该将Head Node的地址作为save()函数的参数。这样就可以用来初始化电流。

在调用save()函数时,您可以传递头节点

void main()
{   
    //other code...

    saving(Head); //while calling the saving() method just pass the head node as parameter

   //remaining code... 
}

这样 *current 将被初始化为头节点(第一个节点)

无效保存(结构节点*当前){文件*输出;

       out = fopen("foo.txt", "wb");
        if(out == NULL) return;

        printf("Writing to file...");

        while(current != NULL)
        {
                    fwrite (current->name, sizeof current->name, 1, out);
                fwrite (current->title, sizeof current->title, 1, out);
                fwrite (current->type, sizeof current->type, 1, out);
                current = current->next;
        }

        printf("Done!\n");
        fclose(out);
}
于 2013-10-14T08:58:37.653 回答
0

您的循环变量未初始化。所以可能什么都没有写,因为当时它可能是 NULL 。您必须将其初始化为适当的值,以便它可以进入 while 循环。使用调试器会立即向您展示这一点。

根据您对节点的定义,调用也fwrite可能产生错误的结果,但您应该先发布它,然后才能确定。

于 2013-10-14T08:23:14.570 回答