【发布时间】:2016-05-23 07:40:07
【问题描述】:
代码 =>
#include<stdio.h>
typedef struct {
unsigned short c2;
unsigned long c4;
} TAKECH;
int main() {
TAKECH tch;
FILE *fp_in;
fp_in = fopen("in.txt","rb");
fread(&tch,6,1,fp_in);
printf("First two bytes: %x\n",tch.c2);
printf("Next four bytes: %x\n",tch.c4);
fclose(fp_in);
return 0;
}
输出 =>
First two bytes: 6261
Next four bytes: bfd56665
in.txt =>
abcdef
Hexeditor(vim editor :%!xxd) 显示这个 =>
0000000: 6162 6364 6566 0a abcdef.
需要解释输出:
First two bytes: 6261
First two bytes: 6162
为什么我不能在输出中得到6364?我怎样才能用printf("Next four bytes: %x\n",tch.c4); 得到接下来的四个字节(6364 6566) 为什么我得到Next four bytes: bfd56665 ,bfd5 是从哪里来的?
任何答案都将受到高度赞赏。
提前致谢。
【问题讨论】:
-
为什么这个问题用 c++ 标记?
-
您希望
fread(&tch,6,1,fp_in);做什么?老实说,最简单的答案是这样做真的没有多大意义。 -
@DavidSchwartz,我想将前两个字节分配给 tch.c2(ab) 并将后四个字节分配给 tch.c4(cdef) 。
-
@shibly 那么为什么不编写代码来做到这一点呢?!创建一个六字节缓冲区,例如
char buf[6];,将文件读入其中,然后将每个字节准确地放在您想要的位置,例如tch.c2=buf[0]; tch.c2<<=8; tch.c2|=buf[1];或任何您想要的。您不能随机转换指针并期望得到合理的结果,您必须编写您真正想要的代码。 (另外,你问错了问题。说明你想做什么,并寻求一个好的方法。不要以一开始就没有意义的方式寻求帮助来解决问题!) -
@shibly 有没有可能,是的。聪明吗,不。当有一个更简单、100% 可移植的解决方案时,为什么还要编写复杂的、无缘无故的不可移植代码呢?而且,作为奖励,您实际上是在编写代码,完全按照您想要做的事情,而不是使用您精心设计的各种环境组合来做您想做的事情,然后如果这些情况发生变化,您的代码就会中断。