user-0 提问: 储存文件后为什么会乱码？求大佬解答

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 供参考：#include<stdio.h> #include<string.h> #include<stdlib.h>  struct Telephone{       char   number[20];       char   name[20];       char   sex[20];       char   age[20];       char   speciaity[20];       char   Class[20];       struct Telephone *next; };  typedef struct Telephone TEL; TEL *head=NULL;  void showmenu(); //菜单 void Appenditem();//添加学生信息 void print();  //浏览所有学生信息 void Finditem1(); //查找学生信息 （按学号） void Finditem2(); //查找学生信息 （按姓名） void Removeitem();//删除学生信息 void Saveandfree();//保存到文件 void Open();//打开文件   int main(int argc, char* argv[]) {      char ch;      Open();   //打开文件      while(1){            showmenu(); //显示菜单            scanf(" %c",&ch);            switch(ch){                  case '1':Appenditem(); //添加学生信息                           break;                  case '2':print();      //浏览所有学生信息                           break;                  case '3':Finditem1();  //查找学生信息1.按学号                           break;                  case '4':Finditem2();  //查找学生信息2.按姓名                           break;                  case '5':Removeitem(); //删除学生信息信息                           print();      //输出删除后的结果                           break;                  case '0':Saveandfree();//保存并释放内存                           exit(0);      //退出系统                           break;                  default:                           printf("选择错误!");                           break;            }      } }  //菜单 void showmenu() {      printf("\n*****************欢迎使用学生信息管理系统*****************\n");      printf("\n*****************根据主菜单提示选择所想要的操作*****************\n");      printf("\t1.添加学生信息\n");      printf("\t2.浏览所有学生信息\n");      printf("\t3.按学号查询学生信息\n");      printf("\t4.按姓名查询学生信息\n");      printf("\t5.删除学生信息\n");      printf("\t0.保存并退出系统！\n");      printf("*************************************************\n");      printf("\t请选择：\n"); }  //添加学生信息 void Appenditem() {      TEL *p1=NULL,*p2=NULL;      p1=(TEL *)malloc(sizeof(TEL));//申请结点      printf("输入学号:\n");        //添加信息      scanf("%s",p1->number);      printf("输入姓名：\n");      scanf("%s",p1->name);      printf("输入性别：\n");      scanf("%s",p1->sex);      printf("输入年龄：\n");      scanf("%s",p1->age);      printf("输入专业：\n");      scanf("%s",p1->speciaity);      printf("输入班级：\n");      scanf("%s",p1->Class);      p1->next=NULL;               //保存到链表      if (head==NULL) {         head=(TEL *)malloc(sizeof(TEL));//申请空间         head->next=p1;      } else {         for (p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾         p2->next=p1;      }      printf("此信息已添加！"); }  //浏览所有学生信息 void print() {      TEL *p=NULL;      if (head==NULL){         printf("此学生信息管理系统中无记录，请输入记录后在使用本功能！\n");         return;      }      printf("**************学生信息管理系统*********************\n");      //输出信息  printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next)          printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class); }  //查找学生信息1.按学号 void Finditem1() {      TEL *p;      char findname[20];      printf("请输入要查找的学号：\n");      scanf("%s",findname);      printf("**************学生信息管理系统*********************\n");      printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for (p=head->next;p!=NULL;p=p->next) {          if(strcmp(p->number,findname)==0)             printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);      } }  //查找学生信息2.按姓名 void Finditem2() {      TEL *p;      char name[20];      printf("请输入要查找的姓名：\n");      scanf("%s",name);      printf("**************学生信息管理系统*********************\n");      printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next) {         if(strcmp(p->name,name)==0)            printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);      } }  //删除学生的信息 void Removeitem() {      char findname[20];            //先查找 后删除      TEL *p = head->next, *pr = head->next;      printf("请输入要删除的学号：\n");      scanf(" %s",&findname);      if (head->next == NULL){          printf("无此节点!\n");          return;      }      while ((strcmp(p->name,findname)!=0 )&& p->next != NULL){          pr =p;          p =p->next;      }      if (strcmp(findname, p->name)==0){ //输出删除信息          printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->next->number,p->next->name,p->next->sex,                                            p->next->age,p->speciaity,p->Class);          if (p == head->next)              head->next = p->next;          else              pr->next = p->next;          free(p);      }      printf("此信息已删除！"); }  //保存链表信息到文件并释放内存空间 void Saveandfree() {      TEL  *p=NULL;      FILE *fp;      char *Book="books.txt";      if (head==NULL){          printf("\n记录为空！\n");          return;      }      else p=head->next;      if ((fp=fopen(Book,"wb+"))==NULL){          printf("\n打不开文件!\n");          return;      }      while (p!=NULL){                     //保存信息            //fwrite(p,sizeof(TEL),1,fp); //这个写法是把结构体第7项 p->Telephone *next;也写入文件了，                                          //所谓的乱码就是这部分的内容。            fprintf(fp,"%s %s %s %s %s %s ",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);            p=p->next;      }      printf("保存完毕!");      fclose(fp);      //*****释放链表空间*****      for(;head->next!=NULL;){          p=head->next;          head->next=head->next->next;          free(p);      }      free(head); }  //文件信息输出到链表 void Open() {      FILE *fp;      TEL  *p1=NULL,*p2=NULL,*temp=NULL;      if ((fp=fopen("books.txt","rb+"))==NULL){         printf("\n****************这是一个新的学生信息管理系统******************\n");         return;      }      head=(TEL *)malloc(sizeof(TEL));      head->next=NULL;      temp=p2=head;      while (! feof(fp)){         //循环读取            p1=(TEL *)malloc(sizeof(TEL));            temp=p2;            p2->next=p1;            p2=p1;            //fread(p1,sizeof(TEL),1,fp); //对应的读入文件的方法也不一样            fscanf(fp,"%s %s %s %s %s %s",p1->number,p1->name,p1->sex,p1->age,p1->speciaity,p1->Class);      }      temp->next=NULL;      fclose(fp);               //关闭文件 }

user: user-3
content: 是不是因为保存的字符串没有使用 null-terminated string 的原因，试试在每个要保存的字符串后加个'\n'。

user: user-3
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  struct Telephone{      char number[20];      char name[20];      char sex[20];      char age[20];      char speciaity[20];      char Class[20];           struct Telephone *next; };  typedef struct Telephone TEL;  TEL *head=NULL;  void showmenu();                  //菜单 void Appenditem();                //添加学生信息 void print();                     //浏览所有学生信息 void Finditem1();                 //查找学生信息 （按学号） void Finditem2();                 //查找学生信息 （按姓名） void Removeitem();                //删除学生信息     void Saveandfree();               //保存到文件 void Open();                      //打开文件 void main() {      char ch;      Open();                       //打开文件      while(1) {           showmenu();               //显示菜单           scanf(" %c",&ch);           switch(ch)  {               case '1':                 Appenditem();    //添加学生信息                    break;               case '2':                 print();         //浏览所有学生信息                    break;               case '3':                 Finditem1();     //查找学生信息1.按学号                    break;               case '4':                 Finditem2();     //查找学生信息2.按姓名                    break;               case '5':                 Removeitem();    //删除学生信息信息                    print();         //输出删除后的结果                    break;               case '0':                 Saveandfree();   //保存并释放内存                    exit(0);         //退出系统                    break;               default:                    printf("选择错误!");                    break;           }      } }  //菜单 void showmenu() {      printf("\n*****************欢迎使用学生信息管理系统*****************\n");      printf("\n*****************根据主菜单提示选择所想要的操作*****************\n");       printf("\t1.添加学生信息\n");       printf("\t2.浏览所有学生信息\n");       printf("\t3.按学号查询学生信息\n");       printf("\t4.按姓名查询学生信息\n");       printf("\t5.删除学生信息\n");       printf("\t0.保存并退出系统！\n"); printf("*************************************************\n");      printf("\t请选择：\n"); }      //添加学生信息 void Appenditem() {      TEL *p1=NULL,*p2=NULL;           p1=(TEL *)malloc(sizeof(TEL));                     //申请结点      printf("输入学号:\n");                             //添加信息      scanf("%s",p1->number);      printf("输入姓名：\n");      scanf("%s",p1->name);      printf("输入性别：\n");      canf("%s",p1->sex);      printf("输入年龄：\n");      scanf("%s",p1->age);      printf("输入专业：\n");      scanf("%s",p1->speciaity);      printf("输入班级：\n");      scanf("%s",p1->Class);      p1->next=NULL;                                     //保存到链表           if(head==NULL) {           head=(TEL *)malloc(sizeof(TEL));               //申请空间           head->next=p1;      } else {           for(p2=head;p2->next!=NULL;p2=p2->next);       //找到结点尾           p2->next=p1;      }      printf("此信息已添加！"); }  //浏览所有学生信息 void print() {      TEL *p=NULL;      if(head==NULL) {           printf("此学生信息管理系统中无记录，请输入记录后在使用本功能！\n");           return;      }      printf("**************学生信息管理系统*********************\n"); //输出信息       printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next)           printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);   }       //查找学生信息1.按学号 void Finditem1() {      TEL *p;      char findname[20];           printf("请输入要查找的学号：\n");      scanf("%s",findname);      printf("**************学生信息管理系统*********************\n");        printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");             for(p=head->next;p!=NULL;p=p->next) {            if(strcmp(p->number,findname)==0)                printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);        } }  //查找学生信息2.按姓名 void Finditem2() {      TEL *p;      char name[20];      printf("请输入要查找的姓名：\n");      scanf("%s",name);      printf("**************学生信息管理系统*********************\n");        printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next) {           if(strcmp(p->name,name)==0)               printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);       } }       //删除学生的信息 void Removeitem() {      char findname[20];                                     //先查找 后删除      TEL *p = head->next, *pr = head->next;           printf("请输入要删除的学号：\n");      scanf(" %s",&findname);       if (head->next == NULL) {            printf("无此节点!\n");            return;       }            while ((strcmp(p->name,findname)!=0 )&& p->next != NULL)   {             pr =p;             p =p->next;        }       if (strcmp(findname, p->name)==0)                    //输出删除信息        {              printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->next->number,p->next->name,\                   p->next->sex,p->next->age,p->speciaity,p->Class);               if (p == head->next)                         head->next = p->next;               else                   pr->next = p->next;                            free(p);              }        printf("此信息已删除！");   }  //保存链表信息到文件并释放内存空间 void Saveandfree() {      TEL *p=NULL;      FILE *fp;      char *Book="books.txt";      if(head==NULL) {           printf("\n记录为空！\n");           return;      }      else           p=head->next;                if((fp=fopen(Book,"wb+"))==NULL)   {             printf("\n打不开文件!\n");             return;        }            while(p!=NULL)                              //保存信息        {             fwrite(p,sizeof(TEL),1,fp);             p=p->next;        }            printf("保存完毕!");       fclose(fp);     //*****释放链表空间*****       for(;head->next!=NULL;)  {            p=head->next;            head->next=head->next->next;             free(p);       }       free(head); }  //文件信息输出到链表 void Open() {      FILE *fp;      TEL *p1=NULL,*p2=NULL,*temp=NULL;           if((fp=fopen("books.txt","rb+"))==NULL)  {            printf("\n****************这是一个新的学生信息管理系统******************\n");            return;       }           head=(TEL *)malloc(sizeof(TEL));      head->next=NULL;      temp=p2=head;           while(! feof(fp))                            //循环读取       {            p1=(TEL *)malloc(sizeof(TEL));            temp=p2;            p2->next=p1;            p2=p1;            fread(p1,sizeof(TEL),1,fp);       }           temp->next=NULL;      fclose(fp);                                   //关闭文件 }

user: user-4
content: 为什么都喜欢这么发代码呢？自己看着代码好看懂逻辑吗？～