| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 424 人关注过本帖, 1 人收藏
标题:这个程序的读取功能有点问题,自己找不出来了,麻烦大家看看
只看楼主 加入收藏
cokilee
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-2-23
结帖率:75%
收藏(1)
 问题点数:0 回复次数:5 
这个程序的读取功能有点问题,自己找不出来了,麻烦大家看看
这个程序,从B.TXT读取数据的时候有点问题,读取的数据不正确,哪个大虾帮忙看看:
程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct class_//成绩结构体
{
        char no2[10];   
        char no1[5];
        char name1[10];
        float score_;
        float score[3];
        float all;
        float aver;
        int paiming;
        struct class_*next1;
}pp;
typedef struct student//学生基本信息
{
    char no[10];
    char name[20];
    char sex[5];
    char num[5];
    char tel[15];
   
    struct student *next;
}STU;
/*******************************************************************************************************************************/
STU*xinxia()//A.txt信息的录入
{
    FILE *fp;
    STU *p1,*h=NULL,*p2;
    p1=(STU*)malloc(sizeof(STU));
    h=p1;

    fp=fopen("A.txt","r");
    if(!fp)
    {
        printf("文件打开失败!\n");
        exit(1);
    }

    if(!feof(fp))//从文件中读数据直到文件尾
    {   
        //头结点 赋值
        if(!fscanf(fp,"%s    %s    %s    %s    %s",p1->no,p1->name,p1->sex,p1->num,p1->tel))
        {
            printf("文件读取不成功\n");
            exit(1);
        }
        printf("%s    %s    %s    %s    %s\n",p1->no,p1->name,p1->sex,p1->num,p1->tel);
        

        while(!feof(fp))
        {
            p2=(STU*)malloc(sizeof(STU));   //新结点
            if(!fscanf(fp,"%s    %s    %s    %s    %s",p2->no,p2->name,p2->sex,p2->num,p2->tel))
            {
                printf("文件读取不成功\n");
                exit(1);
            }
            printf("%s    %s    %s    %s    %s\n",p2->no,p2->name,p2->sex,p2->num,p2->tel);
            p2->next=NULL;

            p1->next=p2;
            p1=p2;
        }
        fclose(fp);
    }
    return h;
   
//    p1=h;
/*    while(p1!=NULL)//这里,对所输出的数据进行测试!
    {
        printf("%s    %s    %s    %s    %s\n",p1->no,p1->name,p1->sex,p1->num,p1->tel);   
        p1=p1->next;
   
    }*/
}
/********************************************************************************/
pp*xinxib()//B.txt信息录入
{
    FILE *fp2;
    pp *q1,*q2=NULL,*h1=NULL;//pp为科目结构体的类型
   
    fp2=fopen("B.txt","r");
        if(!fp2)
        {
            printf("文件打开失败");
            exit(1);
        }
        q1=(pp*)malloc(sizeof(pp));
        h1=q1;
        if(!fscanf(fp2,"%s    %s    %s    %f    %f    %f    %f\n",q1->no2,q1->no1,q1->name1,&q1->score_,&q1->score[0],&q1->score[1],&q1->score[2]))   
            {
                printf("文件B读取不成功\n");
                exit(1);
            }
            printf("%s    %s    %s    %f    %f    %f    %f\n",q1->no2,q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2]);
            while(!feof(fp2))
            {           
                q2=(pp*)malloc(sizeof(pp));//新节点
                if(!fscanf(fp2,"%s    %s    %s    %f    %f    %f    %f\n",q2->no2,q2->no1,q2->name1,&q2->score_,&q2->score[0],&q2->score[1],&q1->score[2]))
                {
                    printf("文件读取失败\n");
                    exit(1);
                }   
                printf("%s    %s    %s    %f    %f    %f    %f\n",q2->no2,q2->no1,q2->name1,q2->score_,q2->score[0],q2->score[1],q2->score[2]);
                q2->next1=NULL;
                q1->next1=q2;
                q1=q2;               
            }
            fclose(fp2);
            return h1;

}

 /******************************************************************************************************/

 mimaxg()//密码修改。
{
    system("cls");
    system("color fc");
    system("title 密码修改");
    FILE *mima;
    int i=0;
    char m1[10],m2[10],m3[10];
    mima=fopen("my.txt","r");
    fscanf(mima,"%s",m2);
    fclose(mima);
    do
    {
        printf("请输入原密码:");
        scanf("%s",m1);
        i++;
    }while(strcmp(m1,m2)&&i<3);//输入3次错误就退出。
    printf("请输入新密码:");
    scanf("%s",m1);
    system("cls");
    printf("请再次输入新密码:");
    scanf("%s",m3);
    system("cls");
    if(strcmp(m1,m3)==0)
    {
        printf("密码修改成功。\n");
        mima=fopen("my.txt","w");
        fprintf(mima,"%s",m1);
    }
    else
    {
        printf("两次输入密码不同,密码修改失败\n");
    }
    fclose(mima);
    system("pause");
    system("cls");
    return 0;

   
}
/************************************************************************************/
  int xinxips( STU *h,pp *h1)//信息排序
{
    pp *q1,*temp;
    STU *p1;
    int i=0,j,k;
    p1=h;
    q1=h1;
    while(q1!=NULL)
    {
        if(q1->score[2]!=-1)
        {
            q1->all=q1->score[0]*3/20+q1->score[2]*7/10+q1->score[1]*3/20;
            q1->aver=q1->all/3;
            q1=q1->next1;
        }
        else
        {
            q1->all=q1->score[0]*3/10+q1->score[2]*7/10;
            if(q1->all>=90)
            {
                q1->aver=q1->score_;
            }
            else
            {
                if(q1->all>=80)
                    q1->aver=q1->score_*4/5;
                else
                {
                    if(q1->all>=70)
                    {
                        q1->aver=q1->score_*3/4;
                    }
                    else
                    {
                        if(q1->all>60)
                        {
                            q1->aver=q1->score_*3/5;
                        }
                        else
                        {
                            if(q1->all<60)
                                q1->aver=0;
                        }
                    }
                }
            }
            q1=q1->next1;
        }
    }
    q1=h1;
    for(k=0;k<i;k++)
        for(j=0;j<i;j++)
        {
            if(q1->all<q1->next1->all)
            {
                temp=(pp*)malloc(sizeof(pp));
                strcpy(temp->no2,q1->no2);
                strcpy(temp->no1,q1->no1);
                strcpy(temp->name1,q1->name1);
                temp->score_=q1->score_;
                temp->score[0]=q1->score[0];
                temp->score[1]=q1->score[1];
                temp->score[2]=q1->score[2];
                temp->all=q1->all;
                temp->aver=q1->aver;
                strcpy(q1->no2,q1->next1->no2);
                strcpy(q1->no1,q1->next1->no1);
                strcpy(q1->name1,q1->next1->name1);
                q1->score_=q1->next1->score_;
                q1->score[0]=q1->next1->score[0];
                q1->score[1]=q1->next1->score[1];
                q1->score[2]=q1->next1->score[2];
                q1->all=q1->next1->all;
                q1->aver=q1->next1->aver;
                strcpy(q1->next1->no2,temp->no2);
                strcpy(q1->next1->no1,temp->no1);
                strcpy(q1->next1->name1,temp->name1);
                q1->next1->score_=temp->score_;
                q1->next1->score[0]=temp->score[0];
                q1->next1->score[1]=temp->score[1];
                q1->next1->score[2]=temp->score[2];
                q1->next1->all=temp->all;
                q1->next1->aver=temp->aver;
                free(temp);
            }
        }
        q1=h1;
        while(q1!=NULL)
        {
            printf("%s    %s    %s    %f    %f    %f    %f    %f    %f\n",q1->no2,q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2],q1->all,q1->aver);
            q1=q1->next1;
        }
        return 0;
}

 /**************************************************************************************/
//按学号查找模块
void nosearch(STU*h,pp*h1)
{
    STU*p;//移动指针
    pp*q1;
    char s[10];
    printf("请输入想要查找的学号:\n");//提示输入学号
    scanf("%s",s);//输入学号
    p=h;//将头指针赋给p
    q1=h1;
    while(p!=NULL&&strcmp(p->no,s))//当记录不是要找的且指针不为空
        p=p->next;//移动指针到下一结点继续查找
    if(p==NULL)
        printf("对不起,查无此人!\n");
    else
        printf("************************查询结果***********************\n");
        printf("学    号:%-11s    姓    名:%-15s",p->no,p->name);
        if(strcmp(q1->no2,p->no)==0)
        {
            while(q1!=NULL)
            {
                printf("课程编号:%-11s    课程名称:%-30s    综合成绩:%7.2f    实得学分:%6.2f 排名%d\n",q1->no1,q1->name1,q1->all,q1->aver,q1->paiming);
                q1=q1->next1;
            }
        }
        printf("---------------------------------------------------\n");
        printf("********************************************************\n");
}
/******************************************************************************/       
       
//按姓名查找模块
void namesearch(STU*h,pp*h1)
{
    STU*p;
    char s[20];//定义数组存放姓名
    pp *q1;
    printf("请输入想要查找的姓名:\n");
    scanf("%s",s);
    p=h;
    q1=h1;
    while(p!=NULL&&strcmp(p->name,s))
        p=p->next;
    if(p==NULL)
        printf("对不起,查无此人!\n");
    else
        printf("************************查询结果***********************\n");
        printf("学    号:%-11s    姓    名:%-15s,p->no,p->name\n");   
        printf("-------------------------------------------------------\n");
    if(strcmp(q1->name1,p->name)==0)
        {
            while(q1!=NULL)
            {
                printf("课程编号:%-11s    课程名称:%-30s    综合成绩:%7.2f    实得学分:%6.2f 排名%d",q1->no1,q1->name1,q1->all,q1->aver,q1->paiming);
                q1=q1->next1;
            }
        }

        printf("********************************************************\n");
}

/*****************************************************************************/
STU*xinxicr1( STU *h)
{
    STU *p1;
    char b[10];
    p1=h;
    printf("开始插入信息\n");
    printf("如需放弃,请按####,否则请按123\n");
    scanf("%s",b);
    if(strcmp(b,"####")==0)
        return 0;
    p1=(STU*)malloc(sizeof(STU));
    if(!p1)
    {
        printf("内存分配失败\n");
        return NULL;
    }
    printf("请输入学号:");
    scanf("%s",p1->no);
    printf("请输入姓名:");
    scanf("%s",p1->name);
    printf("性别:");
    scanf("%s",p1->sex);
    printf("宿舍号:");
    scanf("%s",p1->num);
    printf("电话号码:");
    scanf("%s",p1->tel);
    p1->next=NULL;
    p1->next=h;
    h=p1->next;
    printf("学生信息已经添加到第一个,若想查看排名,请重新检索\n");
    return h;
}
/***************************************/
pp *xinxicr2(pp*h1)
{
    pp *q1;
    q1=h1;
    int k,i;
    printf("请输入课程数:");
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        printf("请输入课程[%d]得名称:",i);
        scanf("%s",q1->name1);
        printf("\t编号:");
        scanf("%s",q1->no1);
        printf("\t学分数:");
        scanf("%f",&q1->score_);       
        do
        {
            printf("\t平时成绩:");
            scanf("%f",&q1->score[0]);
            if(q1->score[0]>100||q1->score[0]<0)
                printf("输入非法,请重新输入\n");
        }while(q1->score[0]>100||q1->score[0]<0);               
        do
        {
            printf("\t实验成绩:");
            scanf("%f",&q1->score[1]);
            if(q1->score[1]>100||q1->score[1]<0)
                printf("输入非法,请重新输入\n");
        }while(q1->score[1]>100||q1->score[1]<0);
        do
        {
            printf("\t卷面成绩:");
            scanf("%f",&q1->score[2]);
            if(q1->score[2]>100||q1->score[2]<0)
                printf("输入非法,请重新输入\n");
        }while(q1->score[2]>100||q1->score[2]<0);
       
    }
    q1->next1=NULL;
    q1->next1=h1;
    h1=q1->next1;
    return h1;
}
/***************************************************/
STU *delete_1(STU *h)
{
    char a[5],n;
    STU *p1,*p2;
    printf("请输入要删除的学号\n");
    scanf("%s",a);
    p1=h;
    p2=h;
    while(p1!=NULL&&strcmp(p1->no,a))
    {
        p2=p1;
        p1=p1->next;
    }
    if(p1=NULL)
        printf("\n没有您要删除的对象,请确认后再操作\n");
    else
    {
        printf("%s\t%s\t%s\t",p1->no,p1->name,p1->sex);
        printf("您确实要删除此对象吗 (y/n)\n");
        scanf("%c",&n);
        if(n=='y'||n=='Y')
        {
            if(p1==h)
            {
                h=p1->next;
            }
            else
            {
                p2->next=p1->next;
            }
            free(p1);
            printf("记录已删除\n");
        }

    }
    return h;   
}
/*********************************************************/
pp *delete_1(pp*h1)
{
    pp *q1,*q2;
    char a[5];
    printf("请再次输入你要删除的学号确认\n");
    scanf("%s",a);
    q1=h1;
    q2=h1;
    while(q1!=NULL)
    {
        q2=q1;
        q1=q1->next1;
    }
    if(q1==h1)
    {
        h1=q1->next1;
    }
    else
    {
        q2->next1=q1->next1;
    }
    free(q1);
    printf("信息已彻底删除");
    return h1;
}
/**********************************************************/
xinxibc(STU*h,pp*h1)
{
    STU *p1,*p2;
    pp *q1;
    FILE *fp;
    int i=0,j;
    p1=h;
    p2=h;
    q1=h1;
    char a[20];
    printf("请输入你想保存到文档的文件名,如果存在,也需要输入(全名称)");
    scanf("%s",a);
    fp=fopen(a,"w+");
    if(!fp)
    {
        printf("文件打开或创建失败\n");
        return NULL;
    }
    while(p1!=NULL)
    {
        p1=p1->next;
        i++;
    }
    p1=h;

    for(j=0;j<i;j++)
    {
        fprintf(fp,"%s\t%s\t%s\t%s\t%s",p1->no,p1->name,p1->sex,p1->num,p1->tel);
        do
        {
           
            if(strcmp(q1->no2,p1->no)==0)
            {
                while(q1!=NULL)
                {
                    fprintf(fp,"%s\t%s\t%f\t%f\t%f\t%f\t%f\t%f\t%d\n",q1->no1,q1->name1,q1->score_,q1->score[0],q1->score[1],q1->score[2],q1->all,q1->aver,q1->paiming);
                    q1=q1->next1;
                }
                q1=h1;
                break;
            }
            q1=q1->next1;

        }while(q1!=NULL);
        p1=p1->next;
    }        

    printf("文本保存成功\n");
    fclose(fp);
    return 0;
}

/**********************************************************************/
void main()//主函数
{
    FILE *mima;
    char m1[10],m2[10];
    int i;
    pp *h1;
    STU *h;
    mima=fopen("my.txt","r");//密码验证
    if(!mima)
    {
        printf("密码文件打开失败\n");
        exit(1);
    }
    fscanf(mima,"%s",m2);
    system("title 口令验证");//标题修改
    do
    {
       
        printf("请输入正确的密码:");
        scanf("%s",m1);       
        system("cls");
        system("pause");
    }while(strcmp(m1,m2));
    while(1)//主界面
    {
        system("color a5");
        system("title 学生信息管理系统");
       
        printf("                      *******************学生信息管理系统******************\n");
        printf("                      *       0 从B中读取学生的课程信息                   *\n");
        printf("                      *       1 直接从目录A下读取学生数据                 * \n");
        printf("                      *       2 对所输入的信息进行检索整理排序!          *\n");
        printf("                      *       3 按学号查找学生信息                        *\n");
        printf("                      *       4 按姓名查找学生信息                        *\n");
        printf("                      *       5 插入记录                                  *\n");
        printf("                      *       6 删除记录                                  *\n");
        printf("                      *       7 进行信息保存,保存文本在当前              *\n");
        printf("                      *       8 密码修改                                  *\n");
        printf("                      *       9 退出                                      *\n");
        printf("                      *****************************************************\n");
        do
        {
            printf("请输入(1-9):");
            scanf("%d",&i);
        }while(i<0||i>9);

            switch(i)
            {
            case 0: h1=xinxib();break;
            case 1: h=xinxia();break;
            case 2: xinxips(h,h1);break;
            case 3: nosearch(h,h1);break;
            case 4: namesearch(h,h1);break;
            case 5:
                {
                    h=xinxicr1(h);
                    h1=xinxicr2(h1);
                }break;//怎么样把两个首地址传出来,这里有问题
            case 6:
                {
                    h=delete_1(h);
                    h1=delete_1(h1);
                }break;
            case 7: xinxibc(h,h1);break;
            case 8: mimaxg();break;
            case 9: exit(0);           
            default: system("color fc");break;
            }
            system("pause");
            system("cls");
    }
   
   
   
}   

FileRecv.zip (969 Bytes)

A.TXT和B.TXT还有密码文本都在这个包里,原始密码为12345
谢谢啦啦!!!
2011-02-24 10:30
liangjinchao
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:376
专家分:697
注 册:2010-11-8
收藏
得分:0 
我只是来围观的

因为有了因为,所以有了所以,既然已成既然,何必再说何必
2011-02-24 13:56
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
    if(!feof(fp))//从文件中读数据直到文件尾
    {   
        //头结点 赋值
        if(!fscanf(fp,"%s    %s    %s    %s    %s",p1->no,p1->name,p1->sex,p1->num,p1->tel))
        {
            printf("文件读取不成功\n");
            exit(1);
        }
        printf("%s    %s    %s    %s    %s\n",p1->no,p1->name,p1->sex,p1->num,p1->tel);
        

        while(!feof(fp)) //这里好像有点问题
        {
            p2=(STU*)malloc(sizeof(STU));   //新结点
            if(!fscanf(fp,"%s    %s    %s    %s    %s",p2->no,p2->name,p2->sex,p2->num,p2->tel))//这是具体的出错点吧
            {
                printf("文件读取不成功\n");
                exit(1);
            }
            printf("%s    %s    %s    %s    %s\n",p2->no,p2->name,p2->sex,p2->num,p2->tel);
            p2->next=NULL;

            p1->next=p2;
            p1=p2;
        }
        fclose(fp);
    }
我猜测,楼主在执行程序时,是否总是出现“文件读取不成功”,然后结束运行?
首先声明,我没有上机调试过这个程序,毕竟没有输入数据文件。只是看到输入部分的程序段,貌似有一个经典错误,所以说下自己的看法。如有问题,请各位大家指正!
为说明问题的方便,将上述程序段抽象如下:
        while(!feof(fp))
        {
            if(!fscanf(fp,"%s    %s    %s    %s    %s",p2->no,p2->name,p2->sex,p2->num,p2->tel))
            {
                printf("文件读取不成功\n");
                exit(1);
            }
        }
关键在feof(fp)的含义。我个人认为(可能不完善),feof()是一个“动作标识函数”,意思是说:feof()反映最近一次读文件操作成功与否。
这就是说,如果某次fscanf()的操作正好读完了最后一组数据,那么,回到while(),!feof(fp)的值为真,那么循环会继续执行,将再执行一次fscanf(),而此时已无数据可读了,因此就有问题了。
如果我说的符合实践结果,那请楼主这样改(我只给出框架):
fscanf(...);
while(!feof(fp))
{
    //赋值部分的操作
    fscanf(...);
}
以上发言,如有问题,请大家指正!

[ 本帖最后由 犬虫门心 于 2011-2-24 14:41 编辑 ]

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-24 14:39
cokilee
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-2-23
收藏
得分:0 
文件倒是能够成功读取,不过就是里面有一列数据的读取是错误的
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-02-24 17:15
wujieru
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:1108
专家分:1939
注 册:2010-10-9
收藏
得分:0 
实在没意思啊
2011-02-24 17:17
cokilee
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2011-2-23
收藏
得分:0 
那个...能解决吗?
2011-02-25 08:10
快速回复:这个程序的读取功能有点问题,自己找不出来了,麻烦大家看看
数据加载中...
 
   



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

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