user-0 提问: 如何将文本数据中的内容以二级制格式保存

回复:
user: user-0
content: 问题解决了~res = (c1-'0')*16+c2-'0'本意应该是将读取的字符ASCII码表示形式恢复成数字表示。这对于不大于9的数字而言是可行的，但大于9的数字，如c，其ASCII值与数值并不是减48的关系。因此最后我才用了这种形式： switch(c1)           {             case 'a': tmp1=10;break;             case 'b': tmp1=11;break;             case 'c': tmp1=12;break;             case 'd': tmp1=13;break;             case 'e': tmp1=14;break;             case 'f': tmp1=15;break;           } 用tmp1来代替（c1-'0'），c2同理。最后问题完满解决。无论如何还是要感谢@Bealing  给支招！

user: user-0
content: 引用 3 楼 bealing 的回复:[quote=引用 2 楼 bammo 的回复:] [quote=引用 1 楼 bealing 的回复:]  # Windows平台测试通过，linux下道理应该一样 #include<stdio.h>  int main() { 	char c1,c2,res; 	FILE *filer = fopen("C:/r.txt","r"); 	FILE *filew = fopen("C:/w.bin","wb"); 	 	if(filer == NULL || filew == NULL){ 		printf("打开失败");  		return 0; 	} 	//循环读取并转换  	while((c1 = fgetc(filer),c2 = fgetc(filer))!= EOF){ 		res = (c1-'0')*16+c2-'0'; //读取的数据是16进制的  		fprintf(filew,"%c",res); 	} 		 	fclose(filer); 	fclose(filew); 	 	return 0;  }    谢谢~ 测试后发现还有一点问题：如果读出的字符对应的十六进制小于等于9，如'5'，则按照你给出的方法可成功转换。但如果某字符对应的十六进制大于9，如'c'，其对应的ASCII值为0x63，减0x30，得到0x33，对应的是'3'。那么转换结果就错了。请问这种情况怎么处理呢？？[/quote] 文本文件中是以字符的ASCII码形式保存的，如下“353538396535”,如果你存在文本文档中的数据如你所说，那么你理解错了，'c'，其对应的ASCII值为0x63，存到文本文档中的值是字符串“63"，而不是数字，所以不是0x63减0x30，而是‘6’-‘0’=6，‘3’-‘0’=3，然后转换成6*16+3 = 0x63 = ’c‘[/quote] 下面是我利用十六进制编辑工具打开文本文档显示的内容：  如果按你所说，'c'存到文件中的值是字符串"63"，那么利用fgetc()一次读出的字符应该是'6'，然而实际情况却是'c'。ASCII码是一种编码形式，数据保存到文件中最终都是以二进制形式，也就是数字，而不是字符串吧？

user: user-1
content: 引用 2 楼 bammo 的回复:[quote=引用 1 楼 bealing 的回复:]  # Windows平台测试通过，linux下道理应该一样 #include<stdio.h>  int main() { 	char c1,c2,res; 	FILE *filer = fopen("C:/r.txt","r"); 	FILE *filew = fopen("C:/w.bin","wb"); 	 	if(filer == NULL || filew == NULL){ 		printf("打开失败");  		return 0; 	} 	//循环读取并转换  	while((c1 = fgetc(filer),c2 = fgetc(filer))!= EOF){ 		res = (c1-'0')*16+c2-'0'; //读取的数据是16进制的  		fprintf(filew,"%c",res); 	} 		 	fclose(filer); 	fclose(filew); 	 	return 0;  }    谢谢~ 测试后发现还有一点问题：如果读出的字符对应的十六进制小于等于9，如'5'，则按照你给出的方法可成功转换。但如果某字符对应的十六进制大于9，如'c'，其对应的ASCII值为0x63，减0x30，得到0x33，对应的是'3'。那么转换结果就错了。请问这种情况怎么处理呢？？[/quote] 文本文件中是以字符的ASCII码形式保存的，如下“353538396535”,如果你存在文本文档中的数据如你所说，那么你理解错了，'c'，其对应的ASCII值为0x63，存到文本文档中的值是字符串“63"，而不是数字，所以不是0x63减0x30，而是‘6’-‘0’=6，‘3’-‘0’=3，然后转换成6*16+3 = 0x63 = ’c‘

user: user-0
content: 引用 1 楼 bealing 的回复: # Windows平台测试通过，linux下道理应该一样 #include<stdio.h>  int main() { 	char c1,c2,res; 	FILE *filer = fopen("C:/r.txt","r"); 	FILE *filew = fopen("C:/w.bin","wb"); 	 	if(filer == NULL || filew == NULL){ 		printf("打开失败");  		return 0; 	} 	//循环读取并转换  	while((c1 = fgetc(filer),c2 = fgetc(filer))!= EOF){ 		res = (c1-'0')*16+c2-'0'; //读取的数据是16进制的  		fprintf(filew,"%c",res); 	} 		 	fclose(filer); 	fclose(filew); 	 	return 0;  }    谢谢~ 测试后发现还有一点问题：如果读出的字符对应的十六进制小于等于9，如'5'，则按照你给出的方法可成功转换。但如果某字符对应的十六进制大于9，如'c'，其对应的ASCII值为0x63，减0x30，得到0x33，对应的是'3'。那么转换结果就错了。请问这种情况怎么处理呢？？

user: user-1
content: # Windows平台测试通过，linux下道理应该一样 #include<stdio.h>  int main() { 	char c1,c2,res; 	FILE *filer = fopen("C:/r.txt","r"); 	FILE *filew = fopen("C:/w.bin","wb"); 	 	if(filer == NULL || filew == NULL){ 		printf("打开失败");  		return 0; 	} 	//循环读取并转换  	while((c1 = fgetc(filer),c2 = fgetc(filer))!= EOF){ 		res = (c1-'0')*16+c2-'0'; //读取的数据是16进制的  		fprintf(filew,"%c",res); 	} 		 	fclose(filer); 	fclose(filew); 	 	return 0;  }