| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6500 人关注过本帖
标题:读取数据出现乱码怎么回事
只看楼主 加入收藏
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
结帖率:50%
收藏
 问题点数:0 回复次数:17 
读取数据出现乱码怎么回事
程序代码:
#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
grmmylbs
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:54
帖 子:1409
专家分:5845
注 册:2016-2-14
收藏
得分:0 
level是乱码吗?是因为你没有给level赋值。
程序代码:
//录入员工数据
void Input(list *head)
{
    char ch;
    list *p, *q;
    p = head;
    while (p->next != NULL)
        p = p->next;
    do
    {
        q = (list *)malloc(sizeof(list));
        memset(q,0,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;
        printf("录入联系人%s成功,是否继续录入?(Y/N) ", q->person.name);
        //fflush(stdin);
        getchar();
        ch = getchar();
    } while (ch != 'N'&&ch != 'n');
    save(head);


}
2016-05-25 09:28
a892502843
Rank: 1
等 级:新手上路
帖 子:17
专家分:4
注 册:2016-5-24
收藏
得分:0 
回复 2楼 grmmylbs
不是这个问题,是我把数据存储到文件中后,再读出后,除了第一行是正确的后面都是乱码
2016-05-25 22:13
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
问题不少,不想一逐个修改,简单变换一下试试:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
#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[10];        //等级
}employee;

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

list *top=NULL;
list *bottom=NULL;

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

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

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

//菜单
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 _list()
{
    printf("工号      姓名      性别      年龄      综合得分\n");
    list *p, *pNext;
    p = top;
    while (p != NULL)
    {
        printf("%-10d%-10s%-10s%-10d%-10.2lf\n", p->person.eid, p->person.name, p->person.gender, p->person.age, p->person.score);
        p = p->next;
    }
}

void _Free()
{
    list *p, *pNext;
    p = top;
    while (p != NULL)
    {
        pNext = p->next;
        free(p);
        p = pNext;
    }
}

int main()
{
    while(1)
    {
        switch(menu())
        {
        case 0:
            _Free();
            printf("\t\t谢谢使用本程序,再见!\n");
            printf("\t\t");
            system("pause");
            exit(0);
        case 1:
            Load();
            system("pause");
            break;//读取当前文件已有员工信息
        case 2:Input();
            system("pause");
            break;//录入员工信息 
        case 3:
            _list();
            system("pause");
            break;
        case 4:;system("pause");
        case 5:;system("pause");
        case 6:;system("pause");
        case 7:;system("pause");
        }
    }
    return 0;
}
2016-05-25 23:57
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
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用a892502843在2016-5-26 22:34:50的发言:

请问下我的代码那样为什么除了第一行会正常,后面会输出乱码呢?我把代码更新了下

你说的"乱码"可能是用文本编辑器打开那个“配置.ini”文件看到的“乱码”,因“配置.ini”不是一个纯文本文件,是个数据文件,只要读入正常就OK。
2016-05-26 22:47
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用a892502843在2016-5-26 22:36:58的发言:

list *top=NULL;
list *bottom=NULL;
还有问下这样定义头尾指针的好处,还有这样不就不能传参了吗

是数据都能作为参数传送的吧?
操作一个数据表,一般有3个基本的指针:表首记录指针、表尾记录指针和当前数据记录指针,方便数据记录定位。
数据链表最好用双向链表,方便操作数据记录的“添加”、“插入”、“删除”和数据往上往下遍历。
2016-05-26 22:54
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
快速回复:读取数据出现乱码怎么回事
数据加载中...
 
   



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

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