关于链表的读写功能,读入时出现乱码的情况

距离我立下要写博客的flag已经过去了十天,今天在编写代码的时候获得了一些见解,具体情境是这样的

读入函数是

DAMI* dami_load();

 DAMI* dami_load()
{
    FILE *fp;
    fp = fopen("DAMI_data.txt", "r");
    int t = 0, flag = 1;
    char ch;
    while(!feof(fp))
    {
        ch = fgetc(fp);
        if(ch=='\n')
        {
            t++;
        }
    }
    fclose(fp);
    t--;                                    //由于写入文件时有换行符,所以要多减1 
    fp = fopen("DAMI_data.txt", "r");       //调整文件指针位置 
    DAMI *q, *h = NULL;
    if(t)                                   //判断是否为空文件,如果没有这条语句,返回的h已经给了空间,但是没有赋值,所以会生成乱码 
    {
        q = (DAMI*)malloc(sizeof(DAMI));
        h = (DAMI*)malloc(sizeof(DAMI));
        q = h;
        h->next = NULL;
        while(t--)
        {
            if(flag)                            //对于头节点的特殊处理 
            {
                fscanf(fp, "%s %s %s %s %s\n", h->NAME, h->STREET, h->CITY, h->EIP, h->STATE);
                flag = 0;
            }
            else
            {
                DAMI *p = (DAMI*)malloc(sizeof(DAMI));
                fscanf(fp, "%s %s %s %s %s\n", p->NAME, p->STREET, p->CITY, p->EIP, p->STATE);
                q->next = p;
                p->next = NULL;
                q = p;
            }
        }
        fclose(fp);    
    }  
    return h;
}

这是正确的代码

void dami_save(DAMI *head)
{
    FILE *fp;
    fp = fopen("DAMI_data.txt", "a+");
    DAMI *q;
    if(fp == NULL)
    {
        printf("\t\t\t\tError!\n\nFile cannot open!\n\n");
        getchar();
    }
    q = head;
    while(q)
    {
        fprintf(fp, "%s %s %s %s %s\n", q->NAME, q->STREET, q->CITY, q->EIP, q->STATE);
        q = q->next;
    }
    fclose(fp);
}

这个是保存函数

上面是引入阶段哈

写入到txt文档里是长这样的,每行是一个节点的信息存储

在 load函数之后可能会出现读入的函数是乱码的情况,这是因为已经给h(如下图)开辟了空间

如果是空文件的话,那么就对h->data什么也没有赋值,那么直接返回一个空的h回去,h->data自然就是乱码了

所以要先判断是否是空文件,然后再确定要不要给h开辟空间,如果是空文件的话,就不要给h开辟空间了

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值