| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1222 人关注过本帖
标题:写了一个系统,文件读写出了问题,求帮助
只看楼主 加入收藏
qq175101845
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2013-10-11
收藏
得分:0 
以下是引用fragileeye在2014-4-25 12:24:52的发言:

ls说得对,我就不明白当初自己自学的时候都是从一个个模块实现起来,我觉得这是很正常的思维啊。没有好砖块和好结构,哪来稳固的房子。
有几点得给lz提个建议:
1、既然是用汇编或c写代码,最基本最重要的一点,不要写自己不明白或不理解或不清楚的代码
2、测试再测试,首先自己要对这个模块满意
3、如果对框架的思维不够清晰,写个简单的文档,写出大方向的逻辑,对着所写文档来写
就lz这个程序,说几处,
1、用户登录,密码怎么能存储在程序中?!
2、数组不初始化,容易导致产生乱码,没调试过吧?
3、全局变量用起来很方便吗?能不用就不用
4、什么时候用数组方便,什么时候用指针灵活?班上成员固定么?数据格式固定么?仔细想清楚再用。

这个只是我们实训的系统,并不是很完善的,用户登陆密码这个是因为文件读写没弄好,所以没有改,
数组初始化在写的时候忘记了,全局变量是我们老师说的,要这样用,
还有,指针的话的确很好,但是对于我们这些学习不是很深入的,用数组比较好,老师也是这么说的,,,所以只能这么做了
2014-04-25 13:20
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:2 
回复 10 楼 TonyDeng
确实多嘴了

总有那身价贱的人给作业贴回复完整的代码
2014-04-25 13:20
qq175101845
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2013-10-11
收藏
得分:0 
以下是引用TonyDeng在2014-4-25 13:19:00的发言:

沒問題就得了,算我多嘴吧。

我说的是没加文件读写的代码就没问题,加了文件读写的代码以后,就文件读写这块出了问题
2014-04-25 13:23
qq175101845
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2013-10-11
收藏
得分:0 
我也只是想知道为什么我的文件读写会出错,并没有想要什么,难道这也不行?

这里不就是相互学习的么?
2014-04-25 13:28
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:2 
估计你写完已经太累了,根本就没调试。
1)字符数组和字符变量不分,输入输出格式符全混了。
2)用文本方式打开文件,又按二进制格式读写文件。
大致弄了一下。不敢保证没有错的地方。
程序代码:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#define N 1000
#define M 5
void xiugai();

/*定义学生结构体*/

struct stu
{
    int num;          //学号
    char name[20];    //姓名
    char sex[20];     //性别
    float mark[M];    //分数
};
struct stu students[N];
int i=0;

/*添加学生信息*/

void students_message()
{
    char pan;
    int j;
    while(1)
    {
        printf("请输入学号:");
        scanf("%d",&students[i].num);
        printf("请输入姓名:");
        scanf("%s",students[i].name);  //-------------
        printf("请输入性别:");
        scanf("%s",students[i].sex);    //-------------
        for(j=0;j<M;j++)
        {
            printf("请输入分数%d:",j+1);
            scanf("%f",&students[i].mark[j]);
        }
        i++;
        while(1)
        {
            printf("是否继续输入?(Y/N)");
            scanf("%c",&pan);   //-----------------char pan;
            getchar();
            switch(pan)
            {
            case 'N':
            case 'n':
                return;
            case 'Y':
            case 'y':
                break;
            default:
                printf("错误,请重新输入!\n");
                continue;
            }
            break;
        }
    }
}

/*修改学生信息*/

void students_recover()
{
    int j,k,t;
    char xiu[50];
    int xiu1;
    char choise;
    printf("请选择修改类型:姓名查询(a)/学号查询(b)");
    scanf("%c",&choise);    //-----------------char choise;
    switch(choise)
    {
    case 'a':
        printf("请输入姓名:");
        scanf("%s",xiu);    //-----------------       
        for(j=0,k=0;j<i;j++)        //-----------------注意数据个数
            if(strcmp((const char *)xiu,students[j].name)==0)     //查询是否存在该姓名
            {
                printf("请输入新的学号:");
                scanf("%d",&students[j].num);
                printf("请输入新的姓名:");
                scanf("%s",students[j].name);    //-----------------
                printf("请输入新的性别:");
                scanf("%s",students[j].sex);    //-----------------
                for(t=0;t<M;t++)
                {
                    printf("请输入分数%d:",t+1);
                    scanf("%f",&students[j].mark[t]);
                }
                k=1;
                break;    //-----------------学号和名字应该理解成是唯一的,相互不同的
            }
        if(k)
            break;
        else
            printf("该学生不存在!\n");
        system("pause");
        break;
    case 'b':
        printf("请输入学号:");
        scanf("%d",&xiu1);
        for(j=0,k=0;j<N;j++)
            if(xiu1==students[j].num)     //查询是否存在该学号
            {
                printf("请输入新的学号:");
                scanf("%d",&students[j].num);
                printf("请输入新的姓名:");
                scanf("%s",&students[j].name);
                printf("请输入新的性别:");
                scanf("%s",&students[j].sex);
                for(t=0;t<M;t++)
                {
                    printf("请输入分数%d:",t+1);
                    scanf("%f",&(students[j].mark[t]));
                }
                k=1;
                break;
            }
        if(k)
            break;
        else
            printf("该学生不存在!\n");
        system("pause");
        break;
    default:
        printf("输入错误!\n");
        break;
    }
}

/*查询学生信息*/

void students_chaxun1()
{
    char choise;
    int j,k,t;
    int cha1;
    char cha[50];
    printf("请选择查询类型:姓名查询(a)/学号查询(b)");
    scanf("%c",&choise);    //--------------char choise;
    switch(choise)
    {
    case 'a':
        printf("请输入姓名:");     //输入姓名查询
        scanf("%s",cha);    //---------
        for(j=0,k=0;j<i;j++)//---------
            if(strcmp((const char *)cha,students[j].name)==0)
            {
                printf("\n\n");
                printf("--------------------------------------------------------------------\n");   
                printf("%10s%10s%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","成绩1","成绩2","成绩3","成绩4","成绩5");
                printf("--------------------------------------------------------------------\n");   
                printf("%10d%10s%8s",students[j].num,students[j].name,students[j].sex);
                for(t=0;t<M;t++)
                    printf("%8.2f",students[j].mark[t]);
                printf("\n");
                printf("--------------------------------------------------------------------\n");   
                printf("\n\n");
                system("pause");
                k=1;
                break;
            }
        if(k)
            break;
        else
            printf("不存在\n");
        system("pause");
        break;
    case 'b':
        printf("请输入学号:");     //输入学号查询
        scanf("%d",&cha1);
        for(j=0,k=0;j<i;j++)        //--------------
            if(cha1==students[j].num)
            {
                printf("\n\n");
                printf("--------------------------------------------------------------------\n");   
                printf("%10s%10s%8s%8s%8s%8s%8s\n","学号","姓名","性别","成绩1","成绩2","成绩3","成绩4","成绩5");
                printf("--------------------------------------------------------------------\n");   
                printf("%10d%10s%8s",students[j].num,students[j].name,students[j].sex);
                for(t=0;t<M;t++)
                    printf("%8.2f",students[j].mark[t]);
                printf("\n");
                printf("--------------------------------------------------------------------\n");   
                printf("\n\n");
                system("pause");
                k=1;
                break;
            }
        if(k)
            break;
        else
            printf("不存在\n");
        system("pause");
    default:
        printf("输入错误!\n");
        break;
    }
}

/*输出学生信息*/

void students_shuchu()
{
    int    j,k;
    printf("\n\n");
    printf("--------------------------------------------------------------------\n");   
    printf("%10s%10s%8s%8s%8s%8s%8s%8s\n","学号","姓名","性别","成绩1","成绩2","成绩3","成绩4","成绩5");
    printf("--------------------------------------------------------------------\n");   
        for(j=0;j<i;j++)
        {
            printf("%10d%10s%8s",students[j].num,students[j].name,students[j].sex);
            for(k=0;k<M;k++)
                printf("%8.2f",students[j].mark[k]);
            printf("\n");
        }
    printf("--------------------------------------------------------------------\n");   
    printf("\n\n");
    system("pause");
}

/*删除学生信息*/

void students_delete()
{
    int j,k;
    int del;
    char del1[50];
    printf("请输入学号:");
    scanf("%d",&del);
    printf("请输入姓名:");
    scanf("%s",del1);        //-----------------------
    for(j=0;j<i;j++)        //-------------注意数据个数
        if(del==students[j].num)
        {
            if(strcmp((const char *)del1,students[j].name)==0)    //验证学号以及姓名
            {
                printf("学生信息核对成功!\n");
                for(k=j;k<i-1;k++)        //-------------1)注意数据个数,2)结构体变量可以整体赋值
                {
                    students[k]=students[k+1];
                }
                printf("该学生已删除!\n");
                i--;
            }
        }
        else
        {
            printf("学生信息核对出错或不存在!\n");
            break;
        }
    system("pause");
}

/*读取文件*/

void read_txt()
{
    FILE *fp;
    int t;
    if((fp=fopen("message.txt","rb"))==NULL)
    {
        printf("不能打开文件!\n");
        return;
    }
    if(fread(&i,sizeof(int),1,fp)!=1)    //------数据个数先读入变量i,fwrite()是写函数
        printf("读文件错误!\n");
    for(t=0;t<i;t++)
    {
        if (fread(&students[t],sizeof(struct stu),1,fp)!=1)    //------读数据入数组,fwrite()是写函数。如果是文本文件对应fprintf()用fscanf()比较方便
            printf("读文件错误!\n");
    }
    fclose(fp); 
}

/*写入文件*/    

void write_txt()
{
    FILE *fp;
    int t;
    if((fp=fopen("message.txt","wb"))==NULL)    //----操作单一不容易错,况且后面不涉及读操作----原先打开方式是文本格式
    {
        printf("不能打开文件!\n");
        return;
    }
    if(fwrite(&i,sizeof(int),1,fp)!=1)        //数据个数先写入文件,-----但是写入又是按二进制格式,如果是文本文件用fprintf()比较方便
        printf("写入文件错误!\n");
    for(t=0;t<i;t++)
    {
        if(fwrite(&students[t],sizeof(struct stu),1,fp)!=1)
            printf("写入文件错误!\n");
    }
    fclose(fp);
}

/*主函数*/

void xxx()
{
    int choice;
    read_txt();
    while(1)
    {
        system("cls");
        printf("欢迎进入学生管理系统!\n");
        printf("---------------------\n");
        printf("   1.添加学生信息\n");
        printf("   2.修改学生信息\n");
        printf("   3.查询学生信息\n");
        printf("   4.输出学生信息\n");
        printf("   5.删除学生信息\n");
        printf("   6.修改系统密码\n");
        printf("   7.退出学生系统\n");
        printf("---------------------\n");
        printf("请选择1-7:");
        scanf("%d",&choice);
        switch(choice)
        {
        case 1:
            students_message();
            break;
        case 2:
            students_recover();
            break;
        case 3:
            students_chaxun1();
            break;
        case 4:
            students_shuchu();
            break;
        case 5:
            students_delete();
            break;
        case 6:
            xiugai();
            break;
        case 7:
            printf("已成功退出学生管理系统\n");
            exit(0);
            break;
        default:
            printf("错误\n");
            getchar();
            system("pause");
        }
        write_txt();
    }
}

2014-04-25 14:02
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
如果写累了,最好出去打打球,休息一下脑子,再调试。这样效率高一点。另外,最好调试的差不多了,别出现太低级的问题,再来论坛问。这样效果会好一点,你自己也进步的快,还能节省大家的时间。
2014-04-25 14:12
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
另外,如果你想打开数据文件,能在文本编辑器中直接看,必须是文本文件。读写不能用fread()和fwrite(),这两个是函数用于二进制文件的。

[ 本帖最后由 kwxx 于 2014-4-25 14:22 编辑 ]
2014-04-25 14:21
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
以下是引用kwxx在2014-4-25 14:21:43的发言:

另外,如果你想打开数据文件,能在文本编辑器中直接看,必须是文本文件。读写不能用fread()和fwrite(),这两个是函数用于二进制文件的。

这恐怕有所偏差  二进制方式可以读写任意文件

DO IT YOURSELF !
2014-04-25 15:05
kwxx
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:309
专家分:913
注 册:2009-5-11
收藏
得分:0 
“二进制方式可以读写任意文件”这倒是。但是用fwrite()将数组中的学生信息写到文件中后,是二进制格式,用文本编辑器打开一定是乱码。
2014-04-25 15:19
qq175101845
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2013-10-11
收藏
得分:0 
以下是引用kwxx在2014-4-25 15:19:11的发言:

 “二进制方式可以读写任意文件”这倒是。但是用fwrite()将数组中的学生信息写到文件中后,是二进制格式,用文本编辑器打开一定是乱码。

谢谢你,你指出的错误我会仔细看看
2014-04-25 16:05
快速回复:写了一个系统,文件读写出了问题,求帮助
数据加载中...
 
   



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

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