mmmmmmm19 2022-07-07 20:49 采纳率: 75%
浏览 637
已结题

c语言txt文件乱码

保存好的文件是乱码
问题相关代码,请勿粘贴截图
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
 
 
typedef struct person
{
    char name[20]; //姓名
    char num[20];//手机号
    char email[20];//邮箱
} PER;
 
 
int menu();//选择界面
void add_person(PER arr[],int *nPtr);//添加
void InputPerson(PER arr[],int i);         
void OutPerson(PER arr[],int i);         
int print_person(PER arr[],int n);     
int FindByName(PER arr[],int n,char *str);//查询
void search_person_name(PER arr[],int n);   
void delete_person(PER arr[],int *nPtr);//删除
void modify_person(PER arr[],int n);//修改
void save_file(PER arr[],int n);//保存
void load_file(PER arr[],int *nPtr);      


int main()
{
    system("color 02");
    SetConsoleTitle("通讯录");
    PER per[100];
    int choice;
    int n;
    load_file(per,&n);
    while(1)
    {
        choice = menu();
        switch(choice)
        {
        case 1:         //添加
            add_person(per,&n); break;
        case 2:         //删除
            delete_person(per,&n);break;
        case 3:               //查询
            search_person_name(per,n);break;        
        case 4:             //修改
            modify_person(per,n);break;
        case 5:         //显示
           print_person(per,n);break;
        case 7:
            //显示
           save_file(per,n);break;
        case 6:         //退出
            printf("\t 谢谢使用\n");
            return 0;
        }
    }
 
}
int menu()//菜单
{
    int choise;
    system("cls");
    system("color 0F");
        printf("\t\t\t\t|========== 欢迎使用通讯录=========|\n");
        printf("\t\t\t\t|              1--添加           |\n");
        printf("\t\t\t\t|              2--删除           |\n");
        printf("\t\t\t\t|              3--查询           |\n");
        printf("\t\t\t\t|              4--修改           |\n");
        printf("\t\t\t\t|              5--显示           |\n");
        printf("\t\t\t\t|              6--退出           |\n");
        printf("\t\t\t\t|              7--保存           |\n");
        printf("\t\t\t\t|==================================|\n");
    printf("\t\t\t\t您的选择是: ");
    scanf("%d",&choise);
    while(choise>7||choise<0)
    {
        printf("请重新选择:");
        scanf("%d",&choise);
    }
    return choise;
}
void load_file(PER arr[],int *nPtr)     
{
    FILE *fp;
    int i;
 
    if((fp=fopen("num.txt","w"))==NULL)
    {
        *nPtr = 0;
        return;
    }
    for(i=0;fread(&arr[i],sizeof(PER),1,fp)!=0;i++);
    *nPtr = i;  
}
void save_file(PER arr[],int n)          //保存
{
    FILE *fp;
    if((fp=fopen("num.txt","w"))==NULL)
    {
        printf("打开文件失败\n");
        system("pause");
        exit(0);
    }
 
    fwrite(arr,n * sizeof(arr[0]),1,fp);
    fclose(fp);
}
int print_person(PER arr[],int n)        //显示
{
    int i;
    printf("%-15s%-15s%-15s%\n","姓名","手机号","邮箱");
 
    for(i=0;i<n;i++)
    {
        OutPerson(arr,i);
    }
    system("pause");
    return 0;
}
void add_person(PER arr[],int *nPtr)    //添加
{
    char sel = 'y';
 
    while(sel=='y')
    {
        InputPerson(arr,(*nPtr)++);   
        printf("是否继续添加联系人?(y,n)\n");
        scanf(" %c",&sel);
    }
    save_file(arr,*nPtr);
    printf("添加结束\n");
    system("pause");
}
void InputPerson(PER arr[],int i)      
{
    printf("请输入第%d个联系人\n",i+1);
 
    printf("请输入联系人姓名\n");
    scanf("%s",arr[i].name); 
    printf("请输入联系人手机号\n");
    scanf("%s",arr[i].num);
    printf("请输入联系人邮箱\n");
    scanf("%s",arr[i].email);
}
void OutPerson(PER arr[],int i)        
{
    printf("%-15s",arr[i].name);
    printf("%-15s",arr[i].num);
    printf("%-15s",arr[i].email);
    printf("\n");
}

void delete_person(PER arr[],int *nPtr)     //删除
{
    int i,index;
    char str[20];
 
    printf("请输入删除联系人的姓名");
    scanf("%s",str);
    index = FindByName(arr,*nPtr,str);
 
    if(index<0)
    {
        printf("\n 该联系人不存在\n");
        system("pause");
        return ;
    }
    for(i=index;i<*nPtr-1;i++)
        arr[i]=arr[i+1];
 
    (*nPtr)--;
 
    printf("\n 删除成功\n");
    system("pause");
    save_file(arr,*nPtr);
}

void  modify_person(PER arr[],int n)         //修改
{
    int index;
    char sel;
    char str[20];
    printf("请输入姓名:\n");
    scanf("%s",str);
    index = FindByName(arr,n,str);
 
    if(index<0)
    {
        printf("该联系人信息不存在\n");
        system("pause");
        return ;
    }
    printf("修改前的原纪录如下:\n");
    OutPerson(arr,index);
 
    printf("是否修改姓名(y/n):\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入姓名:\n");
        scanf("%s",arr[index].name);
    }
    printf("是否修改手机号:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的手机号:\n");
        scanf("%s",arr[index].num);
    }
    printf("是否修改邮箱:\n");
    scanf(" %c",&sel);
    if(sel =='y')
    {
        printf("请输入新的邮箱:\n");
        scanf("%s",arr[index].email);
    }
    save_file(arr,n);
    system("pause");
}
void search_person_name(PER arr[],int n)    //查询
{
    int index;
    char str[20];
    printf("请输入查找的联系人姓名");
    scanf("%s", str);
 
    index=FindByName(arr,n,str);
 
    if(index<0)
    {
        printf("该联系人不存在");
        system("pause");
        return ;
    }
    printf("%-15s%-15s%-15s%\n","姓名","手机号","邮箱");
    OutPerson(arr,index);
    system("pause");
}
int FindByName(PER arr[],int n,char *str)  
{
    int i;
 
    for (i=0;i<n;i++)
        if(strcmp(arr[i].name,str)==0)
        return i;
    return -1;
}


运行结果及报错内容

img

我的解答思路和尝试过的方法

txt的编码是ANSI

我想要达到的结果
  • 写回答

3条回答 默认 最新

  • qzjhjxj 2022-07-07 23:05
    关注

    修改处见注释,供参考:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <windows.h>
    typedef struct person
    {
        char name[20]; //姓名
        char num[20];//手机号
        char email[20];//邮箱
    }PER;
    
    
    int menu();//选择界面
    void add_person(PER arr[],int *nPtr);//添加
    void InputPerson(PER arr[],int i);
    void OutPerson(PER arr[],int i);
    int print_person(PER arr[],int n);
    int FindByName(PER arr[],int n,char *str);//查询
    void search_person_name(PER arr[],int n);
    void delete_person(PER arr[],int *nPtr);//删除
    void modify_person(PER arr[],int n);//修改
    void save_file(PER arr[],int n);//保存
    void load_file(PER arr[],int *nPtr);
    
    
    int main()
    {
        system("color 02");
        SetConsoleTitle("通讯录");
        PER per[100];
        int choice;
        int n;
        load_file(per,&n);
        while(1)
        {
            choice = menu();
            switch(choice)
            {
            case 1:         //添加
                add_person(per,&n); break;
            case 2:         //删除
                delete_person(per,&n);break;
            case 3:               //查询
                search_person_name(per,n);break;        
            case 4:             //修改
                modify_person(per,n);break;
            case 5:         //显示
               print_person(per,n);break;
            case 7:
                //显示
               save_file(per,n);break;
            case 6:         //退出
                printf("\t 谢谢使用\n");
                return 0;
            }
        }
     
    }
    int menu()//菜单
    {
        int choise;
        system("cls");
        system("color 0F");
            printf("\t\t\t\t|========== 欢迎使用通讯录=========|\n");
            printf("\t\t\t\t|              1--添加           |\n");
            printf("\t\t\t\t|              2--删除           |\n");
            printf("\t\t\t\t|              3--查询           |\n");
            printf("\t\t\t\t|              4--修改           |\n");
            printf("\t\t\t\t|              5--显示           |\n");
            printf("\t\t\t\t|              6--退出           |\n");
            printf("\t\t\t\t|              7--保存           |\n");
            printf("\t\t\t\t|==================================|\n");
        printf("\t\t\t\t您的选择是: ");
        scanf("%d",&choise);
        while(choise>7||choise<0)
        {
            printf("请重新选择:");
            scanf("%d",&choise);
        }
        return choise;
    }
    void load_file(PER arr[],int *nPtr)
    {
        FILE *fp;
        int i;
        //if((fp=fopen("num.txt","w"))==NULL)修改
        if((fp=fopen("num.txt","r"))==NULL)
        {
            *nPtr = 0;
            return;
        }
        //for(i=0;fread(&arr[i],sizeof(PER),1,fp)!=0;i++); 修改
        for(i=0;fscanf(fp,"%s %s %s\n",arr[i].name,arr[i].num,arr[i].email)==3;i++);
        *nPtr = i;
        fclose(fp); //修改
    }
    void save_file(PER arr[],int n)          //保存
    {
        int i;
        FILE *fp;
        if((fp=fopen("num.txt","w"))==NULL)
        {
            printf("打开文件失败\n");
            system("pause");
            exit(0);
        }
        //fwrite(arr,sizeof(PER),n,fp);     修改
        //fwrite(arr,n * sizeof(arr[0]),1,fp);
        for(i=0;i<n;i++)
            fprintf(fp,"%s %s %s\n",arr[i].name,arr[i].num,arr[i].email);
        fclose(fp);
    }
    int print_person(PER arr[],int n)        //显示
    {
        int i;
        printf("%-15s%-15s%-15s\n","姓名","手机号","邮箱");
        //printf("%-15s%-15s%-15s%\n","姓名","手机号","邮箱"); 修改
        for(i=0;i<n;i++)
        {
            OutPerson(arr,i);
        }
        system("pause");
        return 0;
    }
    void add_person(PER arr[],int *nPtr)    //添加
    {
        char sel = 'y';
     
        while(sel=='y')
        {
            InputPerson(arr,(*nPtr)++);   
            printf("是否继续添加联系人?(y,n)\n");
            scanf(" %c",&sel);
        }
        save_file(arr,*nPtr);
        printf("添加结束\n");
        system("pause");
    }
    void InputPerson(PER arr[],int i)      
    {
        printf("请输入第%d个联系人\n",i+1);
     
        printf("请输入联系人姓名\n");
        scanf("%s",arr[i].name); 
        printf("请输入联系人手机号\n");
        scanf("%s",arr[i].num);
        printf("请输入联系人邮箱\n");
        scanf("%s",arr[i].email);
    }
    void OutPerson(PER arr[],int i)        
    {
        printf("%-15s",arr[i].name);
        printf("%-15s",arr[i].num);
        printf("%-15s",arr[i].email);
        printf("\n");
    }
     
    void delete_person(PER arr[],int *nPtr)     //删除
    {
        int i,index;
        char str[20];
     
        printf("请输入删除联系人的姓名");
        scanf("%s",str);
        index = FindByName(arr,*nPtr,str);
     
        if(index<0)
        {
            printf("\n 该联系人不存在\n");
            system("pause");
            return ;
        }
        for(i=index;i<*nPtr-1;i++)
            arr[i]=arr[i+1];
     
        (*nPtr)--;
     
        printf("\n 删除成功\n");
        system("pause");
        save_file(arr,*nPtr);
    }
     
    void  modify_person(PER arr[],int n)         //修改
    {
        int index;
        char sel;
        char str[20];
        printf("请输入姓名:\n");
        scanf("%s",str);
        index = FindByName(arr,n,str);
     
        if(index<0)
        {
            printf("该联系人信息不存在\n");
            system("pause");
            return ;
        }
        printf("修改前的原纪录如下:\n");
        OutPerson(arr,index);
     
        printf("是否修改姓名(y/n):\n");
        scanf(" %c",&sel);
        if(sel =='y')
        {
            printf("请输入姓名:\n");
            scanf("%s",arr[index].name);
        }
        printf("是否修改手机号:\n");
        scanf(" %c",&sel);
        if(sel =='y')
        {
            printf("请输入新的手机号:\n");
            scanf("%s",arr[index].num);
        }
        printf("是否修改邮箱:\n");
        scanf(" %c",&sel);
        if(sel =='y')
        {
            printf("请输入新的邮箱:\n");
            scanf("%s",arr[index].email);
        }
        save_file(arr,n);
        system("pause");
    }
    void search_person_name(PER arr[],int n)    //查询
    {
        int index;
        char str[20];
        printf("请输入查找的联系人姓名");
        scanf("%s", str);
     
        index=FindByName(arr,n,str);
     
        if(index<0)
        {
            printf("该联系人不存在");
            system("pause");
            return ;
        }
        printf("%-15s%-15s%-15s%\n","姓名","手机号","邮箱");
        OutPerson(arr,index);
        system("pause");
    }
    int FindByName(PER arr[],int n,char *str)  
    {
        int i;
     
        for (i=0;i<n;i++)
            if(strcmp(arr[i].name,str)==0)
            return i;
        return -1;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月8日
  • 已采纳回答 7月8日
  • 创建了问题 7月7日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效