selfcultivate 2019-03-11 01:28 采纳率: 0%
浏览 954

c语言,为什么用fread 读入文件 链表 每次都会多一个节点?

做文件输入输出的时候,用的是结构体链表,放入的链表只有两个一个是头,
另一个是有内容的(头无内容)。但是每次读出的时候总会多出一个节点,
结构体 和 读入 读出 代码如下

typedef struct vip                                                      //定义VIP用户的结构体
{   
    char card[19];
    char name[11];
    char tel[14];
    int time;
    char date[13];
    char key[11];
    struct vip *next;
}vip;

typedef struct cus                                                      //定义登陆用户的结构体(包括临时和VIP)
{   
    char card[19];
    int lie;                                                            //位置;
    char date[13];                                                      //上机日期
    time_t upt;                                                         //上机时间
    time_t downt;                                                       //下机时间
    int in;                                                             //押金
    int realin;                                                         //实际收入
    int flag;                                                           //1 激活状态 0 未激活(下机)状态
    int identify;                                                       //1 VIP 用户 2 临时用户
    char tel[14];
    struct cus *next;
}cus;

void load(vip *head1,cus *head2,int longth)                                             //装载VIP 和 临时登陆 的 记录
{
    FILE *fp1,*fp2;
    vip *p1,*tail1 = head1;
    cus *p2,*tail2 = head2;

    fp1 = fopen("vip.bin","rb")

    if((fp2 = fopen("day.bin","rb")) == NULL)
    {
        return ;
    }

    while(!feof(fp1))
    {   
        p1 = (vip *)malloc(sizeof(vip)*1);
        fread(p1,sizeof(vip),1,fp1);
        tail1 ->next = p1;
        tail1 = p1;
        tail1 ->next = NULL;
    //  longth ++;
        printf("1");
    }

    while(!feof(fp2))
    {   
        p2 = (cus *)malloc(sizeof(cus)*1);
        fread(p2,sizeof(cus),1,fp2);
        tail2 ->next = p2;
        tail2 = p2;
        tail2 ->next = NULL;
    }
    close(fp1);
    close(fp2);
}
void a(vip *head1,cus *head2)                                           //信息保存
{
    FILE *fp1,*fp2;
    vip *p1 = head1 ->next;
    cus *p2 = head2 ->next;

    fp1 = fopen("vip.bin","wb");

    fp2 = fopen("day.bin","wb");

    while(p1 != NULL)
    {   

        fwrite(p1,sizeof(vip),1,fp1);
        p1 = p1 ->next;
    }
    while(p2 != NULL)
    {   
        fwrite(p2,sizeof(cus),1,fp2);
        p2 = p2 ->next;
    }
    close(fp1);
    close(fp2);
}

当我运行程序时,(保存的时候 只有两个 节点,并且尾next为空),保存两个节点,第二次读取的时候却有三个节点,不知道问题出在了哪里。求大神帮忙看看!!!!!

  • 写回答

1条回答

  • weixin_44781157 2019-03-18 10:29
    关注

    应该是while(!feof(fp))这个使用的问题!
    feof判断文件结束是通过读取函数fread/fscanf等返回错误来识别的,故而判断文件是否结束应该是在读取函数之后进行判断。
    例如:
    int c;
    while(!feof(fp))
    {
    c = fgetc(fp);
    printf("%X\n", c);
    }
    执行结果会发现多输出了一个FF,原因就是在读完最后一个字符后,feof()仍然没有探测到文件结尾,直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。这样就多输出了一个-1(即FF)。

    评论

报告相同问题?

悬赏问题

  • ¥15 本题的答案是不是有问题
  • ¥15 关于#r语言#的问题:(svydesign)为什么在一个大的数据集中抽取了一个小数据集
  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 蓝桥杯单片机第十三届第一场,整点继电器吸合,5s后断开出现了问题
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形