| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 865 人关注过本帖
标题:读取文件时多了一条乱码,希望大家斧正
只看楼主 加入收藏
daybreaker
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2010-10-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
读取文件时多了一条乱码,希望大家斧正
我做的一个成绩管理系统,但是保存到文件里面后在读取出来就多了一条乱码的记录,希望大家斧正

保存函数如下:

void save(STU *head)        //保存记录的函数
{
    FILE *fp;
    STU *p1;
    char name[15];
    char state = 0;            //保存是否成功的状态,成功保存则为0,失败为1
    if(head == NULL)
        printf("\nlist null!");
    else
    {
        p1 = head;
        printf("\n请输入保存记录的名字(少于15个字符):");
        scanf("%s",name);
        if((fp = fopen(name,"w+")) == NULL)
            printf("\ncannot open this file");
        else
        {
            do
            {
                if(fwrite(p1,LEN,1,fp) != 1)
                {
                    printf("\nfile write error!\n");
                    state = 1;
                    break;
                }
                p1 = p1->next;
            }while(p1 != NULL);
            if(state == 0)
                printf("\nThe %d records save scuccee!\n",n);
            fclose(fp);
        }
    }
}

读取函数如下:

STU *read(void)            //读取记录的函数
{
    FILE *fp;
    STU *head;
    STU *p1,*p2;
    char name[15];
    head = NULL;
    printf("\n请输入读取记录的名字(少于15个字符):");
    scanf("%s",name);
    if((fp = fopen(name,"r+")) == NULL)
    {
        printf("\nfile cannot open");
        return(head);
    }
    else
    {
        n = 0;
        head = (STU *)malloc(LEN);
        p1 = head;
        do
        {
            fread(p1,LEN,1,fp);
            p2 = p1;
            p1 = (STU *)malloc(LEN);
            p2->next = p1;
            n++;
        }while(!feof(fp));
        p2->next = NULL;
        free(p1);
        return(head);
        fclose(fp);
    }
}
搜索更多相关主题的帖子: 名字 null 
2011-03-02 14:59
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:20 
        do
        {
            fread(p1,LEN,1,fp);
            p2 = p1;
            p1 = (STU *)malloc(LEN);
            p2->next = p1;
            n++;
        }while(!feof(fp));
这里有两个错误:
1、当fread(p1, LEN, 1, fp);读取到最后一条记录后,!feof(fp)的值为真,循环会继续;那么会再次读取一条记录,但现在已经无记录可读,这时,!feof(fp)的值才会为假;因此,p1所指向的空间的值将保持为原来的值不变。这样,相当于把最后一条记录读取了两遍。
2、你先把读取到的值赋值给p2,然后再申请一个节点,让p1指向,那么这个节点将成为整个链表的最后一个节点,但是,p1申请空间后,你并没有赋值,里面应该是垃圾数据。但这个节点是你链表中的最后一个节点,还是要写进文件里的。所以会出现乱码。
请楼主再仔细跟踪一遍程序。

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-03-02 15:25
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:0 
void save(STU *head)        //保存记录的函数
{
    FILE *fp;
    STU *p1;
    char name[15];
    int state = 0;            //保存是否成功的状态,成功保存则为0,失败为1

   唯实惟新 至诚致志
2011-03-02 15:27
快速回复:读取文件时多了一条乱码,希望大家斧正
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038860 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved