user-0 提问: 求助 c语言文件转换为链表 链表输出后有乱码

回复:
user: user-1
content: 写入读取均以二进制文件模式，格式化写入时尽量可以控制到每个字节，不要用fprintf格式化 fwrite写入整个结构 fread读入整个结构

user: user-0

user: user-0
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  struct dormitory { 	char room[4]; 	char bed[2]; 	char condition[4]; 	char studentcode[10]; 	char name[20]; 	char classcode[5]; 	int year; 	int month; 	int day; 	 	struct dormitory *next; } *p,*p1,*tail,*tail1,head,head1,t;  void showmenu(); void choose(int a); void save(); void informationA(); void informationB(); void modification(); void cancel(); void file_link(); void show(); int checkcheck1(char a[10]); int checkcheck2(char a[10],char c[10]);  int main() { 	int x,y; 	showmenu(); 	printf("请输入功能序号\n"); 	 	for(x=1;;x++)    { 		scanf("%d",&y); 		if(y!=7) 		{choose(y);} 		else 		{break;} 	}  	return 0;  }  void showmenu( )  { 	 system("cls"); 	 printf("******欢迎使用宿舍管理系统******\n"); 	 printf(" 本宿舍楼包含三层，每层二十个房间，例（301）\n"); 	 printf(" 1.录入床位信息\n"); 	 printf(" 2.输入学号，查询住宿信息\n"); 	 printf(" 3.输入宿舍号，查询住宿信息\n"); 	 printf(" 4.输入宿舍号、床位号，修改住宿信息\n"); 	 printf(" 5.输入宿舍号、床位号，删除住宿信息\n"); 	 printf(" 6.输出全部数据\n"); 	 printf(" 7.退出\n"); 	 return;  }  void choose(int a) { 	 switch(a) 	 { 	 case 1: save();break; 	 case 2: informationA();break; 	 case 3: informationB();break; 	 case 4: modification();break; 	 case 5: cancel();break; 	 case 6: show();break; 	 } 	 return; }   void save()  {    	 int i,x; 	 FILE *fp; 	 	fp=fopen("宿舍信息.txt","a+");       	if(fp==NULL)     { 		printf("文件打开失败\n");       exit(0);  	 } 	printf("成功进入功能1\n");    // printf("输入'0'结束功能\n"); 	printf("请输入要录入的人数\n"); 	scanf("%d",&x); 	printf("宿舍号 床位号 入住情况(yes or no) 学号 姓名 班级 入住时间(例2019 6 25)\n"); 	 	for(i=0;i<x;i++) 	{ 	  	scanf("%s %s %s %s %s %s %d %d %d",t.room,t.bed,t.condition,t.studentcode,t.name,t.classcode,&t.year,&t.month,&t.day); 	if(t.year<=2019 && t.month<=12 && t.day<=31 && checkcheck1(t.studentcode)==1 && checkcheck2(t.room,t.bed)==1 )    { 	 p=&t;  	 fprintf(fp,"%s %s %s %s %s %s %d %d %d\n",p->room,p->bed,p->condition,p->studentcode,p->name,p->classcode,p->year,p->month,p->day); 	} 	else 	{ 	  printf("输入有误\n"); 	  i--; 	  continue; 	}      fprintf(fp,"\n");      } 	  fclose(fp); 	 printf("功能结束\n"); 	 return;  }  void informationA()  { 	  	char code1[10]; 	printf("成功进入功能2\n"); 		file_link();  		printf("请输入学号\n"); 		 scanf("%s",code1); 		 		p1=head1.next; 		 while(p1!=NULL) 		{ if(strcmp(code1,p1->studentcode)==0) 			 { 			  printf("宿舍号 床位号 入住情况(yes or no) 学号 姓名 班级 入住时间(例2019 6 25)\n"); 			  printf("%s %s %s %s %s %s %d %d %d\n",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,p1->year,p1->month,p1->day); 		      break; 		      } 		 else 		     p1=p1->next; 		 } 		 printf("功能结束\n"); 		 return;  }  void informationB()  { 	 int x; 	 char code1[10]; 	 	      printf("成功进入功能3\n"); 		 	   file_link();  		printf("请输入宿舍号\n"); 		 scanf("%s",code1); 		 		 p1=head1.next; 		 while(p1!=NULL) 		{  		  if(strcmp(code1,p1->room)==0) 			 { 			  printf("宿舍号 床位号 入住情况(yes or no) 学号 姓名 班级 入住时间(例2019 6 25)\n"); 			  printf("%s %s %s %s %s %s %d %d %d\n",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,p1->year,p1->month,p1->day); 		       } 		  p1=p1->next; 		  } 		 printf("功能结束\n"); 		 return;  } void modification() { 	  char a[10],b[10]; 	  FILE *fp; 	  file_link();  	    fp=fopen("宿舍信息.txt","w+");       	   if(fp==NULL)        { 		 printf("文件打开失败\n");          exit(0);  	    } 	   printf("成功进入功能4\n"); 	   printf("请输入相关宿舍号、床位号\n"); 	   scanf("%s%s",a,b); 	    	    	   p1=head1.next; 	    while(p1!=NULL)      {          if(strcmp(p1->room,a)==0 && strcmp(p1->bed,b)==0) 		 { 		  printf("请输入新的住宿信息\n"); 		   printf("宿舍号 床位号 入住情况(yes or no) 学号 姓名 班级 入住时间(例2019 6 25)\n"); 	      scanf("%s %s %s %s %s %s %d %d %d",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,&p1->year,&p1->month,&p1->day); 		   		 }        fprintf(fp,"%s %s %s %s %s %s %d %d %d\n",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,p1->year,p1->month,p1->day); 	   p1=p1->next;      } 		printf("功能结束\n"); 	fclose(fp);      return ; }  void cancel() { 	  int x; 	  char a[10],b[10]; 	  FILE *fp; 	  file_link();  	    fp=fopen("宿舍信息.txt","w+");       	   if(fp==NULL)        { 		 printf("文件打开失败\n");          exit(0);  	    } 	   printf("成功进入功能4\n"); 	   printf("请输入相关宿舍号、床位号\n"); 	   scanf("%s%s",a,b); 	    	   p1=head1.next; 	    while(p1!=NULL)      {          if(strcmp(p1->room,a)==0 && strcmp(p1->bed,b)==0) 		 { 		 printf("删除成功\n"); 		 } 		 else 		 { 			 fprintf(fp,"%s %s %s %s %s %s %d %d %d\n",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,p1->year,p1->month,p1->day); 		 } 		 p1=p1->next; 		        } 		printf("功能结束(若未提示删除成功则删除失败)\n"); 	fclose(fp);      return ; }   void file_link()  {       	     	    FILE *fp; 	    fp=fopen("宿舍信息.txt","a+");         if(fp==NULL)        { 		 printf("文件打开失败\n");          exit(0);  	    } 		head1.next=NULL; 	    tail1=&head1;          while(feof(fp)==0) 		{ 		 p1=(struct dormitory *)malloc(sizeof(struct dormitory));          fscanf(fp,"%s%s%s%s%s%s%d%d%d",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,&p1->year,&p1->month,&p1->day); 		 tail1->next=p1; 	     p1->next=NULL; 		 tail1=p1; 		 } 		 		fclose(fp); 	   return;  } void show()  { 	file_link(); 	p1=head1.next; 	while(p1!=NULL) 	{ 	printf("%s %s %s %s %s %s %d %d %d\n",p1->room,p1->bed,p1->condition,p1->studentcode,p1->name,p1->classcode,p1->year,p1->month,p1->day); 	p1=p1->next; 	} 	 	return; }

user: user-2
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了