问题描述
- 为什么我的结构体在文件中读出打印出现乱码?
-
struct activity { int num; char content[1000]; char time[10]; char request[1000]; char creator[50]; char participants[1000][10]; int parti_num; //struct activity *next; }; int create_activity(char creator[])//创建新的活动 { FILE *fp=fopen("new_activity.txt","a+"); if(fp==NULL) { printf("创建失败n"); exit(1); } printf("----------创建活动----------n"); struct activity n_act; memset(n_act.content,'',sizeof(n_act.content)); memset(n_act.creator,'',sizeof(n_act.creator)); memset(n_act.request,'',sizeof(n_act.request)); memset(n_act.participants,'',sizeof(n_act.participants)); //n_act.next=NULL; memset(n_act.time,'',sizeof(n_act.time)); printf("请输入活动消息:"); getchar(); gets(n_act.content); strcpy(n_act.creator,creator); printf("请输入活动时间(yyyymmdd为格式):"); scanf("%s",n_act.time); printf("请输入活动人数:"); scanf("%d",&n_act.parti_num); printf("请输入活动要求(以回车或空格结束):"); getchar(); //gets(n_act.request); scanf("%s",n_act.request); memset(n_act.participants,'',sizeof(n_act.participants)); fwrite(&n_act,sizeof(struct activity),1,fp); printf("创建完成n"); user_menu(creator); //fflush(fp); fclose(fp); return 0; } int view_new_activity(char user_name[]) { FILE *fp=fopen("new_activity.txt","rb"); struct activity a[1010],temp; int i=0,len=0,j; //while(!feof(fp)) //{ //len++; fread(a,sizeof(struct activity),2,fp); //if(i>=1000) //break; //} //int len=i; fclose(fp); for(i=0;i<len-1;i++) { for(j=i+1;j<len;j++) { if(strcmp(a[i].time,a[j].time)>0) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<len;i++) { a[i].num=i; } printf("----------正在征集的活动----------n"); for(i=0;i<2;i++) print_act(a[i]); user_menu(user_name); return 0; } int print_act(struct activity t) { printf("活动编号为:%dn",t.num); printf("活动消息:n"); printf("%sn",t.content); printf("活动时间(yyyymmdd为格式):n"); printf("%sn",t.time); printf("活动人数:n"); printf("%dn",t.parti_num); printf("活动要求:n"); printf("%sn",t.request); printf("---------------------------n"); return 0; }
解决方案
因为你的文件不是文本文件,而是二进制文件,所以用记事本打开有乱码很正常。
解决方案二:
printf("请输入活动消息:");
getchar();
gets(n_act.content);
问题出在 getchar() 上, 汉字 一般用两个字节表示, 第一个字节被getchar()吃掉了, 剩下的一个字节跟下一个字的第一字节组成一个汉字, 后面都错开一个字节, 就形成了乱码。
解决方案三:
只接去掉 getchar();
printf("请输入活动消息:");
gets(n_act.content);
这样应该就好了
时间: 2024-09-20 00:16:23