user-0 提问: 最后输出date.dat以文本打开有乱码，求更早

回复:
user: user-0
content: case 3: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新年龄>>"); 		scanf("%d",&p); 		Room[j].Client_list.Age=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 4: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新身份证号>>"); 		for(t=0;t<20;t++) 			scanf("%s",&a[t]); 			for(t=0;t<20;t++) 				Room[j].Client_list.ID_Card[t]='0'; 		strcpy(Room[j].Client_list.ID_Card, a); 		system("pause>nul"); 		system("cls"); 		break; 	case 5: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新入住年>>"); 		scanf("%d",&p); 		Room[j].Client_list.year=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 6: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入新入住月>>"); 		scanf("%d",&p); 		Room[j].Client_list.month=p; 		system("pause>nul"); 		system("cls"); 		break; 	case 7: 		display_hotel(); 		printf("\n"); 		printf("请输入客户所在房号>>"); 		scanf("%d", &j); 		printf("请输入入住日>>"); 		scanf("%d",&p); 		Room[j].Client_list.data = p; 		system("pause>nul"); 		system("cls"); 		break; 	case 8: 		system("cls"); 		save(); 		return; 	} 	save(); 	return; } /*------------------------------------------------*/ void open_file() { 	void clean_date(); 	FILE *fp; 	int i; 	if((fp=fopen("date.dat","rb+"))==NULL) 	{ 		printf("Can not open file!\n"); 		exit(0); 	} 	for(i=0; i<NUM; i++ ) 	{ 		if(fread(&Room[i],sizeof(struct Hotel),1,fp) != 1) 		{ 			printf("\nRead error!!\n"); 			printf("Auto Clean\n"); 			clean_date(); 			exit(0); 		} 	} 	fclose(fp); }  /*------------------------------------------------*/  void clean_date() { 	FILE *fp; 	int i; 	if((fp=fopen("date.dat","wb+"))==NULL) 	{ 		printf("Can not open file!\n"); 	} 	for(i=0; i<NUM; i++) 	{ 		memset(&Room[i],0,sizeof(struct Hotel)); 		Room[i].Room_ID=i; 		if(fwrite(&Room[i], sizeof(struct Hotel),1,fp) != 1) 		{ 			printf("Clean error!!\n"); 			exit(0); 		} 	} 	fclose(fp);  	system("pause>nul"); 	system("cls"); }  /*------------------------------------------------*/  int display_hotel() { 	int g, count; 	count=0;      for(g=0;g<NUM;g++)  //通过循环输出未使用的房间数 	{ 		if(Room[g].Sign == 0)  			++count;  		else  			if(Room[g].Sign != 0) 				printf("正在使用的房间号:%d\n",g); 	} 	if(80 == count) 	{ 		printf("未有人员入住!!\n"); 		save(); 		return -1; 	}   	else 	{ 		printf("未使用的房间数:%d\n",count); 	} 	return 1; } /*------------------------------------------------*/

user: user-1
content: 将fwrite，fread改为fprintf，fscanf

user: user-0
content: 老师希望我改下源代码 就可以直接在date.dat打开后看见   能直接指导下吗

user: user-2
content: 你没有搞清楚数据和字符的区别。 定义一个结构体  struct A {     int data; }; A output; output.data = 65;//即‘A’ 然后 fwrite(&output, 1, 1, fp); 现在你打开文本文件，看到的就是“A”。  而且你直接输出结构体，还要考虑内存对齐。

user: user-3
content: 你没有搞清楚数据和字符的区别。 定义一个结构体  struct A {     int data; }; A output; output.data = 65;//即‘A’ 然后 fwrite(&output, 1, 1, fp); 现在你打开文本文件，看到的就是“A”。  而且你直接输出结构体，还要考虑内存对齐。

user: user-1
content: void open_file() {     void clean_date();     FILE *fp;     int i;     if((fp=fopen("date.dat","rb"))==NULL) {         printf("Can not open file!\n");         exit(0);     }     for(i=0; i<NUM; i++ ) {         if(fread(&Room[i],sizeof(struct Hotel),1,fp) != 1) {             printf("\nRead error!!\n");             printf("Auto Clean\n");             clean_date();             exit(0);         }     }     fclose(fp);      for(i=0; i<NUM; i++ ) {         printf("------------------%d------------------\n",i);         printf("\n标记(其中：1表示有人，0表示没人):%d",Room[i].Sign);         printf("\n姓名:%s",Room[i].Client_list.Name);         printf("\n性别(其中：1表示男，2表示女):%d",Room[i].Client_list.Sex);         printf("\n年龄:%d",Room[i].Client_list.Age);         printf("\n身份证号:%s",Room[i].Client_list.ID_Card);         printf("\n入住年份:%d",Room[i].Client_list.year);         printf(" 月:%d",Room[i].Client_list.month);         printf(" 日:%d",Room[i].Client_list.data);         printf("\n房间号:%d",Room[i].Room_ID);         printf("\n客房单价:%d",Room[i].Price);     } }

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了