C++从文件里边读数据转为HEX问题,

void readfile(){ FILE *fp; char b[50]; fp = fopen("c:\\1.dcm", "r");fscanf(fp,"%s",b);int a=0;for(a=0;a<=49;a++){ printf("%x\n",b[a]);}getchar();}
读到8H的时候,显示错码fffff2,而且超过2DH以后全部显示错码FFFFFCC,不管你数组开了多大,这是为什么?谢谢

第1个回答  2013-07-09
int c,n=1;
fp = fopen("c:\\1.dcm", "rb"); // 用2进制方法打开文件
while(1)
{
c = fgetc(fp); // 读1个字符
if ( feof(fp)) break; // 结束条件
printf("%02x ",c); // 输出
if (n%50==0) printf("\n"); //输出换行控制
n++;
}
第2个回答  2013-07-09
对printf 的使用许多人认识不够,包括教材。
printf 中的格式串 必须 与后面的参数类型一致,编译时无法做到是否一致的检查,
而执行时,printf 只按格式串中的类型对后面的参数进行处理,当这两类型不
一致时,并不对参数进行转换,所以就会出现奇怪的错误了。
如 %x 是按四个字节的整数进行16进显示,而实际你的是 字符类型,printf仍把
这字符的地址当成整数地址处理,所以,结果是奇怪的,随机的。只要对后果的类型
强制一下就可以了。
printf("%2x\n", (int) (unsigned char)b[a]);
再试试。追问

的确,按你的改好了很多,但是第2个问题也就是超过2DH以后全部显示错码FFFFFCC,不管你数组开了多大,没有解决,再帮想想 谢谢

追答

fscanf 的使用不合理,你不是文本文件,
而fscanf 会重新解释读到的随机字符,如 8H就是退格的含义,
会引起新的问题。
你用 fread 吧,这不会出现这个问题。

本回答被提问者采纳
相似回答
大家正在搜