weixin_44616497
九穗禾
采纳率60%
2019-03-02 23:58

从txt文件中读取数据存入到链表,即使文件没有内容也会存上数字和乱码

代码如下:

contacts* read(char* filename)//把文件读入链表
{
    FILE* fp;
    if ((fp = fopen("people.txt","r")) == NULL)//以可读写方式打开文件,如果没有则建立一个
        {
            printf ("文件打开失败!\n");
            exit (1);
        }
    contacts *head, *q, *p, *h;
    head = NULL;
    p = (contacts*)malloc(sizeof(contacts));
    if(NULL == p)
    {
        printf("内存分配错误");
        exit(1);
    }
    q = p; //开始时,p和q均指向第1个结点
    while (!feof(fp))//创建链表, 并把文件内容输入
    {
        n++;
        if (n == 1)
        {
            head = p;
        }
        else
        {
            q->next = p;
        }

        q = p;//q是最后一个结点
        p = (contacts*)malloc(sizeof(contacts));
        fscanf(fp,"%d %s %s",&p->no,&p->name,&p->sex);
        /*int i=0;
        for(i=0;i<8;i++)
        {
            fscanf(fp,"%s",&p->phonenumber[i]);
        }
        fscanf(fp,"%s %d %d %d",&p->address,&p->byear,&p->bmonth,&p->bday);*/
    };
    q->next = NULL;//输入完毕后,q->next为NULL
    h = head;
    fclose(fp);
    return h;
}

void browse(contacts* head)//显示程序中所有记录的信息。
{
    while(head)//当head不为空的时候
    {
        printf("\n==================================\
                  \n序号:%d\
                  \n姓名:%s             性别:%s",head->no,head->name,head->sex);
        /*printf("\n电话号码:\n");
        int i;
        for(i=0; i<8; i++)
        {
            if(strlen(head->phonenumber[i]) == 0)
            {
                continue;
            }
            else
            {
                printf("%s\n",head->phonenumber[i]);
            }
        }
        printf("住址:%s               ",head->address);
        printf("生日:%d年%d月%d日",head->byear,head->bmonth,head->bday);*/
        printf("\n==================================\n");
        head = head->next;
    }
}

运行结果
图片说明

为啥会这样。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • woshixushuai woshixushuai 2年前

    使用malloc为指针分配内存后,建议使用memset函数为该内存区域数据初始化。如果没有这一步操作,就会读出该区域以前使用时留下的垃圾数据。

    点赞 评论 复制链接分享

相关推荐