| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 458 人关注过本帖
标题:求助~数据块文件读写之后变成乱码怎么办
只看楼主 收藏
不要做咸鱼
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-3-5
结帖率:0
  已结贴   问题点数:20  回复次数:10   
求助~数据块文件读写之后变成乱码怎么办
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct patient
{
    char id[20];
    char name[20];
    char sex[5];
    int age,year,month,day;
    char cases[200];
    char consumption[20];
    struct patient *next;
}PATIENT;

PATIENT * Input_Patient();
void Save_Patient(PATIENT *head);
void Find_Patient();


int main()
{
    PATIENT *h;
    h=Input_Patient();
    Find_Patient();
    return 0;
}

PATIENT * Input_Patient()
{
    PATIENT *p1,*p2,*head;
    int flag=1,x;

    head=(PATIENT *)malloc(sizeof(PATIENT));
    p1=head;
    while(flag==1)
    {
        p2=(PATIENT *)malloc(sizeof(PATIENT));
        printf("请输入病人ID:");
        scanf("%s",p1->id);
        printf("请输入病人姓名:");
        scanf("%s",p1->name);
        printf("请输入病人性别:");
        scanf("%s",p1->sex);
        printf("请输入病人年龄:");
        scanf("%d",&p1->age);
        printf("请输入病人入院时间(年/月/日):");
        scanf("%d%d%d",&p1->year,&p1->month,&p1->day);
        printf("请输入病人病例:");
        scanf("%s",p1->cases);
        printf("请输入病人消费情况:");
        scanf("%s",p1->consumption);
        p1->next=p2;
        p1=p2;
        printf("继续输入病人信息请按 1:");
        scanf("%d",&flag);
    }
    p2->next=NULL;
    printf("病人信息输入结束!\n是否保存病人信息?(1.是/2.否)\n");
    scanf("%d",&x);
    if(x==1)
        Save_Patient(head);
    ///else
        ///Main_Patient();
    return head;
}
void Save_Patient(PATIENT *head)
{
    PATIENT *p;
    FILE *fp;
    if((fp=fopen("patient","a"))==NULL)
    {
        printf("打开文件过程出现错误!\n");
        ///Main_Patient();
    }
    for(p=head->next;p!=NULL;p=p->next)
        fwrite(p,sizeof(PATIENT),1,fp);
    fclose(fp);
    printf("病人信息已存入!\n");
}
void Find_Patient()
{
    PATIENT *p;
    FILE *fp;
    int x;
    char id[20],name[20];

    p=(PATIENT *)malloc(sizeof(PATIENT));

    printf("请选择你要使用的查找方式:\n");
    printf("1.通过ID查找\n");
    printf("2.通过姓名查找\n");
    scanf("%d",&x);
    if(x==1)
    {
        printf("\n请输入病人ID:");
        scanf("%s",id);
        if((fp=fopen("patient","r"))==NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while(!feof(fp))
        {
            fread(p,sizeof(PATIENT),1,fp);
            if(strcmp(p->name,name)==0)
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n",p->id,p->name,p->sex,p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n",p->year,p->month,p->day,p->cases,p->consumption);
            }
        }
        fclose(fp);
    }
    else if(x==2)
    {
        printf("\n请输入病人姓名:");
        scanf("%s",name);
        if((fp=fopen("patient","r"))==NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while(!feof(fp))
        {
            fread(p,sizeof(PATIENT),1,fp);
            if(strcmp(p->name,name)==0)
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n",p->id,p->name,p->sex,p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n",p->year,p->month,p->day,p->cases,p->consumption);
            }
        }
        fclose(fp);
    }
}


[此贴子已经被作者于2018-3-12 20:55编辑过]

2018-03-12 16:15
吹水佬
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:141
帖 子:5832
专家分:25332
注 册:2014-5-20
  得分:7 
试试 fopen("patient","rb")
2018-03-12 16:20
Jeyyion_han
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:207
专家分:301
注 册:2018-1-22
  得分:7 
之前我也遇到过这种问题,不过我是用的VS,我不知道你是用的什么编译软件,可能和你文件打开或者读取的函数有关,你可以用楼上的试试
2018-03-12 17:06
不要做咸鱼
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-3-5
  得分:0 
回复 2楼 吹水佬
谢谢,但是还是不对
2018-03-12 17:06
吹水佬
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:141
帖 子:5832
专家分:25332
注 册:2014-5-20
  得分:0 
回复 4楼 不要做咸鱼
不好说,没看到将数据写到文件的代码。
Save_Patient()好象也没写文件的代码。
2018-03-12 17:39
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:7 
回复 楼主 不要做咸鱼
先给你指一下语法错误。再谈逻辑问题。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-12 17:55
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:0 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct patient
{
    char id[20];
    char name[20];
    char sex[5];
    int age,year,month,day;
    char cases[200];
    char consumption[20];
    struct ptient *next; //结构体名称上面是写着patient对吧。
}PATIENT;

PATIENT * Input_Patient();
void Save_Patient(PATIENT *head);
void Find_Patient();


int main()
{
    PATIENT *h;
    h=Input_Patient();
    Find_Patient();
    return 0;
}

PATIENT * Input_Patient()
{
    PATIENT *p1,*p2,*head;
    int flag=1,x;

    head=(PATIENT *)malloc(sizeof(PATIENT));
    p1=head;
    while(flag==1)
    {
        p2=(PATIENT *)malloc(sizeof(PATIENT));
        printf("请输入病人ID:");
        scanf("%s",p1->id);
        printf("请输入病人姓名:");
        scanf("%s",p1->name);
        printf("请输入病人性别:");
        scanf("%s",p1->sex);
        printf("请输入病人年龄:");
        scanf("%d",&p1->age);
        printf("请输入病人入院时间(年/月/日):");
        scanf("%d%d%d",&p1->year,&p1->month,&p1->day);
        printf("请输入病人病例:");
        scanf("%s",p1->cases);
        printf("请输入病人消费情况:");
        scanf("%s",p1->consumption);
        p1->next=p2;
        p1=p2;
        printf("继续输入病人信息请按 1:");
        scanf("%d",&flag);
    }
    p2->next=NULL;
    printf("病人信息输入结束!\n是否保存病人信息?(1.是/2.否)\n");
    scanf("%d",&x);
    if(x==1)
        Save_Patient(head);
    ///else
        ///Main_Patient();
    return head;
}
void Save_Patient(PATIENT *head)
{
    PATIENT *p;
    FILE *fp;
    if((fp=fopen("patient","a"))==NULL)
    {
        printf("打开文件过程出现错误!\n");
        ///Main_Patient();
    }
    for(p=head->next;p!=NULL;p=p->next)
        fread(p,sizeof(PATIENT),1,fp);//下面的Find_Patient()是读取数据用fread可以理解。这里用fread是想要干啥?
    fclose(fp);
    printf("病人信息已存入!\n");
}


还有Find_Patient()函数,文件打开了,操作后又没fclose操作.


[此贴子已经被作者于2018-3-12 18:05编辑过]


普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-12 18:01
不要做咸鱼
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2018-3-5
  得分:0 
回复 7楼 lanke711
啊应该是fwrite,改的次数有点多都改乱了。。
2018-03-12 20:34
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:0 

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct patient
{
    char id[20];
    char name[20];
    char sex[5];
    int age,year,month,day;
    char cases[200];
    char consumption[20];
    struct patient *next;
}PATIENT;

PATIENT * Input_Patient();
void Save_Patient(PATIENT *head);
void Find_Patient();


int main()
{
    PATIENT *h;
    h=Input_Patient();
    Find_Patient();
    return 0;
}

PATIENT * Input_Patient()
{
    PATIENT *p1,*p2,*head;
    int flag=1,x;

    head=(PATIENT *)malloc(sizeof(PATIENT));
    p1=head;
    while(flag==1)
    {
        p2=(PATIENT *)malloc(sizeof(PATIENT));//给p2申请了内存空间
        printf("请输入病人ID:");
        scanf("%s",p1->id);//这里的操作是直接给p1的成员录入数据,下面全是。。。
        printf("请输入病人姓名:");
        scanf("%s",p1->name);
        printf("请输入病人性别:");
        scanf("%s",p1->sex);
        printf("请输入病人年龄:");
        scanf("%d",&p1->age);
        printf("请输入病人入院时间(年/月/日):");
        scanf("%d%d%d",&p1->year,&p1->month,&p1->day);
        printf("请输入病人病例:");
        scanf("%s",p1->cases);
        printf("请输入病人消费情况:");
        scanf("%s",p1->consumption);
        p1->next=p2;//那么你这是想干啥??
        p1=p2;
        printf("继续输入病人信息请按 1:");
        scanf("%d",&flag);
    }
    p2->next=NULL;
    printf("病人信息输入结束!\n是否保存病人信息?(1.是/2.否)\n");
    scanf("%d",&x);
    if(x==1)
        Save_Patient(head);
    ///else
        ///Main_Patient();
    return head;
}
void Save_Patient(PATIENT *head)
{
    PATIENT *p;
    FILE *fp;
    if((fp=fopen("patient","a"))==NULL)
    {
        printf("打开文件过程出现错误!\n");
        ///Main_Patient();
    }
    for(p=head->next;p!=NULL;p=p->next)
        fwrite(p,sizeof(PATIENT),1,fp);
    fclose(fp);
    printf("病人信息已存入!\n");
}
void Find_Patient()
{
    PATIENT *p;
    FILE *fp;
    int x;
    char id[20],name[20];

    p=(PATIENT *)malloc(sizeof(PATIENT));

    printf("请选择你要使用的查找方式:\n");
    printf("1.通过ID查找\n");
    printf("2.通过姓名查找\n");
    scanf("%d",&x);
    if(x==1)
    {
        printf("\n请输入病人ID:");
        scanf("%s",id);
        if((fp=fopen("patient","r"))==NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while(!feof(fp))
        {
            fread(p,sizeof(PATIENT),1,fp);
            if(strcmp(p->name,name)==0)//上面都写着id查询。输入id永远都查不到。
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n",p->id,p->name,p->sex,p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n",p->year,p->month,p->day,p->cases,p->consumption);
              
            }//你这样写。这条循环,会打印两次或以上。
        }
        fclose(fp);
    }
    else if(x==2)
    {
        printf("\n请输入病人姓名:");
        scanf("%s",name);
        if((fp=fopen("patient","r"))==NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while(!feof(fp))
        {
            fread(p,sizeof(PATIENT),1,fp);
            if(strcmp(p->name,name)==0)
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n",p->id,p->name,p->sex,p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n",p->year,p->month,p->day,p->cases,p->consumption);
            }//同上
        }
        fclose(fp);
    }
}

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-12 21:43
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
  得分:0 
稍微修改了一下。其它还有什么问题,你自己调试一下。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

typedef struct patient
{
    char id[20];
    char name[20];
    char sex[5];
    int age, year, month, day;
    char cases[200];
    char consumption[20];
    struct patient *next;
}PATIENT;

PATIENT * Input_Patient();
void Save_Patient(PATIENT *head);
void Find_Patient();


int main()
{
    PATIENT *h;
    h = Input_Patient();
    Find_Patient();
    return 0;
}

PATIENT * Input_Patient()
{
    PATIENT *p1, *p2, *head;
    int flag = 1, x;

    head = (PATIENT *)malloc(sizeof(PATIENT));
    p1 = head;
   
    while (flag == 1)
    {
        p2 = (PATIENT *)malloc(sizeof(PATIENT));
        printf("请输入病人ID:");
        scanf("%s", p2->id);
        printf("请输入病人姓名:");
        scanf("%s", p2->name);
        printf("请输入病人性别:");
        scanf("%s", p2->sex);
        printf("请输入病人年龄:");
        scanf("%d", &p2->age);
        printf("请输入病人入院时间(年/月/日):");
        scanf("%d%d%d", &p2->year, &p2->month, &p2->day);
        printf("请输入病人病例:");
        scanf("%s", p2->cases);
        printf("请输入病人消费情况:");
        scanf("%s", p2->consumption);
        p1->next = p2;   
        p2->next = NULL;
        p1 = p2;

        printf("继续输入病人信息请按 1:");
        scanf("%d", &flag);
    }
    p1->next = NULL;
    printf("病人信息输入结束!\n是否保存病人信息?(1.是/2.否)\n");
    scanf("%d", &x);
    if (x == 1)
        Save_Patient(head);
    ///else
    ///Main_Patient();
    return head;
}
void Save_Patient(PATIENT *head)
{
    PATIENT *p;
    FILE *fp;
    if ((fp = fopen("patient", "a")) == NULL)
    {
        printf("打开文件过程出现错误!\n");
        ///Main_Patient();
    }
    for (p = head->next; p != NULL; p = p->next)
        fwrite(p, sizeof(PATIENT), 1, fp);
    fclose(fp);
    printf("病人信息已存入!\n");
}
void Find_Patient()
{
    PATIENT *p;
    FILE *fp;
    int x;
    char id[20], name[20];

    p = (PATIENT *)malloc(sizeof(PATIENT));

    printf("请选择你要使用的查找方式:\n");
    printf("1.通过ID查找\n");
    printf("2.通过姓名查找\n");
    scanf("%d", &x);
    if (x == 1)
    {
        printf("\n请输入病人ID:");
        scanf("%s", id);
        if ((fp = fopen("patient", "r")) == NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while (!feof(fp))
        {
            fread(p, sizeof(PATIENT), 1, fp);
            if (strcmp(p->id, id) == 0)
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n", p->id, p->name, p->sex, p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n", p->year, p->month, p->day, p->cases, p->consumption);
                break;
            }
        }
        fclose(fp);
    }
    else if (x == 2)
    {
        printf("\n请输入病人姓名:");
        scanf("%s", name);
        if ((fp = fopen("patient", "r")) == NULL)
        {
            printf("打开文件过程中出现错误!\n");
            exit(0);
        }
        while (!feof(fp))
        {
            fread(p, sizeof(PATIENT), 1, fp);
            if (strcmp(p->name, name) == 0)
            {
                printf("ID:%s\n姓名:%s\n性别:%s\n年龄:%d\n", p->id, p->name, p->sex, p->age);
                printf("入院时间:%02d/%02d/%02d\n病例:%s\n消费情况:%s\n", p->year, p->month, p->day, p->cases, p->consumption);
                break;
            }
        }
        fclose(fp);
    }
}

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2018-03-12 21:48







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

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