C - 二进制文件写入问题



好的,这是我的代码的编辑版本以及创建列表的函数。 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);
}

相关内容

  • 没有找到相关文章

最新更新