C语言使用链表向文件中存入数据时出错

使用链表向文件中再次存入数据时发生问题
我想要用fprintf进行文件的重写,达到更新数据的效果,结果我尝试将数据再次写入文件时,数据没有被写入,文件也变成空文件。
我感觉是我打开文件的方式是“w“,导致文件清空,但是我又进行写入了,为什么文件还是空的呢?

这是保存数据的代码:

void save_purchase(purchase *head)//保存数据
{
    FILE *fp;
    purchase *p=NULL;
    fp=fopen("purchase_data.txt","w");
    if(fp==NULL)
        {
            printf("库存文件打开失败\n");
            exit(0);
        }
    p=head;
    if(p!=NULL)
    {
        while(p!=NULL)
        {
            fprintf(fp,"%d %s %s %.2lf %.2lf %d\n",p->goodsnumber,p->supplier,p->goods,p->inprice,p->outprice,p->quantity);
            p=p->next;
        }
    }
    printf("保存成功\n");
    fclose(fp);
}

这是我删除信息的代码:

purchase *delete_purchase(purchase *phead)
{

    purchase *p1,*p2;
    printf("请输入需要删除的物品编号\n");
    int m;
    scanf("%d",&m);
    p1=phead;

    if(m==p1->goodsnumber)
    {
        p2=p1->next;
        free(p1);
        return p2;
    }
    else
    {
        while(m!=p1->next->goodsnumber)
        {
            p1=p1->next;
        }
        p2=p1->next;
        p1->next=p1->next->next;
        free(p2);
        return phead;
    }
}

这里为主函数部分的相关代码:

case 3:
        pointer=load_purchase();
        pointer=delete_purchase(pointer);
        save_purchase(pointer);
        showpurchase(pointer);
        break;

此处为运行结果:

img

此处也未执行我打印数据的操作

img

文件被清空了

而且我的程序时不时抽风,一段时间后就运行错误,关掉再次打开后就又好了。

本人大一新生,很菜,希望大家指点指点

程序崩溃了啊。你在save函数中检查一下head是否为空,或者删除的时候链表破坏了
while(m!=p1->next->goodsnumber)
{
p1=p1->next;
}
这代码很不安全啊。万一没有这个编号的话,程序就崩溃了。