好的,这是我的代码的编辑版本以及创建列表的函数。 start 初始化为全局变量,start=NULL。我也改了我的写法。我没有枚举一长串变量,而是使用 buf 来获取其内容(即名称、标题、类型......mygets只是我创建的一个函数,用于删除后面的。同样的问题出现了。外国符号出来了。
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;
}
}
正如 Baldrick 在他的评论中指出的那样,您没有将current
分配给链表的开始/头节点。
您正在执行的方式,取消引用未初始化的指针,可能会导致程序崩溃,幸运的是,对您来说并非如此。
用:
struct node *current = head; // Or whatever is your head node name
顺便说一句,如果你写一个二进制文件,最好不要把它命名为foo.txt,使用二进制扩展名,如.bin,.dat等,或者最好不要使用任何扩展名。
你的循环变量是未初始化的。所以可能什么都没有写,因为当时可能是空的。您必须将其初始化为正确的值,以便它可以进入 while 循环。使用调试器会立即显示这一点。
根据您对node的定义,对fwrite
的调用也可能产生错误的结果,但您应该发布它,然后才能确定。
为了成功地将链表保存到文件中,必须从第一个节点(头节点)开始,并继续移动到其他节点,直到最后一个节点。在代码中,您没有初始化 *current 到头节点。
您应该将头节点的地址作为 saving() 函数的参数。 这样就可以用于初始化电流。
调用 saving() 函数时,您可以传递头节点
void main()
{
//other code...
saving(Head); //while calling the saving() method just pass the head node as parameter
//remaining code...
}
以便将 *电流初始化为头节点(第一个节点)
无效保存(结构节点*当前) { 文件*输出;
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);
}