| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6499 人关注过本帖
标题:读取数据出现乱码怎么回事
取消只看楼主 加入收藏
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
结帖率:50%
收藏
 问题点数:0 回复次数:8 
读取数据出现乱码怎么回事
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <io.h>

typedef struct 
{
    int    eid;        //员工号
    char name[30];    //姓名
    char gender[10];        //性别
    int    age;        //年龄
    double score;        //综合得分
    char level;        //等级
}employee;

typedef struct list
{
    employee person;
    struct list* next;
}list;

//定义一个头结点
list *Init()
{
    list *head;
    head=(list *)malloc(sizeof(list));
    if(head==NULL)
        return NULL;//申请失败
    head->next=NULL;
    return head;
}

//等级判断
void divide(list *head)
{
    list *q;
    q=head;
    while(q!=NULL)
    {
    if((q->person.score)>=90) q->person.level='O';
    else if((q->person.score)>=80) q->person.level='E';
    else if((q->person.score)>=70) q->person.level='A';
    else if((q->person.score)>=60) q->person.level='P';
    else if(60>(q->person.score)) q->person.level='D';
    q=q->next;
    }
    
}

//读取文件中的数据
void Load(list *head)
{
    FILE *fp;
    list *p,*q;
    p=head;
    p->next=NULL;
    if(0==access("c:\\配置.ini",0))
    {
        if((fp=fopen("c:\\配置.ini","rb"))==NULL) return;
        do
        {
            q=(list *)malloc(sizeof(list));
            if(q!=NULL)
            {
                if(1==fread(q,sizeof(employee),1,fp))
                {
                    p->next=q;
                    q->next=NULL;
                    p=p->next;
                }
                else
                    q=NULL;
            }
        }
        while(q);
        fclose(fp);
    }
}

//保存到文件中
void save(list *head)
{
    FILE *fp;
    list *p;
    if((fp=fopen("c:\\配置.ini","wb"))==NULL)
    {
        printf("文件无法创建请重试!\n");
    }
    p=head->next;
    while(p!=NULL)
    {
        if(fwrite(p,sizeof(list),1,fp)!=1)
            printf("文件写入错误!\n");
        p=p->next;
    }
    printf("文件写入成功!\n");
    fclose(fp);
}

//录入员工数据
void Input(list *head)
{
    char ch;
    list *p,*q;
    p=head;
    while(p->next!=NULL)
        p=p->next;
    do
    {
        q=(list *)malloc(sizeof(list));
        fflush(stdin);
        printf("请输入员工的信息。\n");
        printf("工号:");
        scanf("%d",&q->person.eid);
        printf("姓名:");
        scanf("%s",q->person.name);
        printf("性别:");
        scanf("%s",q->person.gender);
        printf("年龄:");
        scanf("%d",&q->person.age);
        printf("综合得分:");
        q->person.score=q->person.score;
        scanf("%lf",&q->person.score);
        q->next=NULL;
        p->next=q;    
        p=p->next;
        divide(head);
        printf("录入联系人%s成功,是否继续录入?(Y/N) ",q->person.name);
        fflush(stdin);
        ch=getchar();
    }
    while(ch!='N'&&ch!='n');
    save(head);
    

}
//读出数据
void Display(list *head)
{
    list *q;
    q=head->next;
    printf("\n-------------------------");
    printf("\n工号\t姓名\t性别\t年龄\t综合得分\t等级");
    printf("\n-------------------------");
    while(q!=NULL)
    {
        printf("\n%d",q->person.eid);
        printf("\t%s",q->person.name);
        printf("\t%s",q->person.gender);
        printf("\t%d",q->person.age);
        printf("\t%0.1f",q->person.score);
        printf("\t%c",q->person.level);
        q=q->next;//指向下一员工
    }
    printf("\n-------------------------");
    printf("\n");
}


//菜单
int menu()
{
    char c;
    do{
        system("cls");
        printf("\t\t************** 员工管理系统 **************\n");
        printf("\t\t         1.读取当前文件已有员工信息       \n");
        printf("\t\t         2.录入员工信息                   \n");
        printf("\t\t         3.显示所有员工信息               \n");
        printf("\t\t         4.查询员工信息                   \n");
        printf("\t\t         5.修改员工信息                   \n");
        printf("\t\t         6.统计员工信息                   \n");
        printf("\t\t         7.对员工信息进行排序             \n");
        printf("\t\t         0.退出系统                       \n");
        printf("\t\t******************************************\n");
        printf("\t\t请输入您的选择(0-7):");
        fflush(stdin);
        c=getchar();
    }
    while(c<'0'||c>'7');
    return(c-'0');


}


void main()
{
    list *head;
    head=Init();
    while(1)
    {
        switch(menu())
        {
        case 0:
            printf("\t\t谢谢使用本程序,再见!\n");
            printf("\t\t");
            system("pause");
            exit(0);
        case 1:
            Load(head);
            system("pause");
            break;//读取当前文件已有员工信息
        case 2:Input(head);
            system("pause");
            break;//录入员工信息 
        case 3:
            Display(head);
            system("pause");
            break;
        case 4:;system("pause");
        case 5:;system("pause");
        case 6:;system("pause");
        case 7:;system("pause");
        }
    }
    
}



[此贴子已经被作者于2016-5-26 22:35编辑过]

搜索更多相关主题的帖子: color 
2016-05-24 20:26
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 2楼 grmmylbs
不是这个问题,是我把数据存储到文件中后,再读出后,除了第一行是正确的后面都是乱码
2016-05-25 22:13
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 4楼 吹水佬
请问下我的代码那样为什么除了第一行会正常,后面会输出乱码呢?我把代码更新了下
2016-05-26 22:34
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 4楼 吹水佬
list *top=NULL;
list *bottom=NULL;
还有问下这样定义头尾指针的好处,还有这样不就不能传参了吗
2016-05-26 22:36
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 7楼 吹水佬
不是的是这样的
图片附件: 游客没有浏览图片的权限,请 登录注册
2016-05-26 22:57
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 7楼 吹水佬
输出的 配置.ini 文件是二进制打开肯定是乱码我是知道的

[此贴子已经被作者于2016-5-26 23:00编辑过]

2016-05-26 22:58
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 7楼 吹水佬
我如果先前录入2个或者3个员工后,文件储存了然后再开程序读取员工,除了第一个是正常的后面的就有问题了

[此贴子已经被作者于2016-5-26 23:11编辑过]

2016-05-26 22:59
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
以下是引用吹水佬在2016-5-27 08:00:34的发言:


试过更新后的代码未见这情况,删除“配置.ini”文件重新试试看。

我的代码?那我回寝室再试一试,你用的什么编译器
2016-05-27 08:49
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
以下是引用吹水佬在2016-5-27 09:32:05的发言:

问题在这里,读和写数据块的大小应该都是sizeof(employee)
//保存到文件中
void save(list *head)
{
        //if(fwrite(p,sizeof(list),1,fp)!=1)
        if(fwrite(p,sizeof(employee),1,fp)!=1)
}

这次对了谢谢拉两个模块的字节大小不一样怪不得后面出乱码弄好了
2016-05-27 10:11
快速回复:读取数据出现乱码怎么回事
数据加载中...
 
   



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

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