基本上我有一个包含数字的文本文件。我将数字更改为0以启动,然后我从文件中读取2个字节(因为int是2个字节)并将其转换为int。然后我打印结果,然而它打印出奇怪的结果。
因此,当我有0时,由于某种原因打印出2608。
我要发一份文件说我需要通读一个文件,其中字节0到1的偏移代表一个数字。所以这就是我读取字节而不是字符的原因......
我想这个问题是由于读取字节而不是按字符读取,所以如果是这种情况,请你解释为什么它会产生影响?
这是我的代码:
void readFile(FILE *file) {
char buf[2];
int numRecords;
fread(buf, 1, 2, file);
numRecords = buf[0] | buf[1] << 8;
printf("numRecords = %d\n", numRecords);
}
我不确定buf [0] |是什么buf [1]&lt;&lt; 8确实如此,但我从另一个问题得到了......所以我想这也可能是问题所在。
答案 0 :(得分:3)
文本文件中的数字0
实际上将表示为1字节的十六进制数0x30
。 0x30
已加载到buf[0]
。 (在 ASCII表中,0
由0x30
表示)
您在buf[1]
中有垃圾数据,在这种情况下,值为0x0a
。 (0x0a
在ASCII表中是\n
)
将这两者合并为buf[0] | buf[1] << 8
会产生0x0a30
,其中2608
为十进制。请注意,<<
是逐位左移运算符。
(此外,int
类型的大小在许多系统中都是4字节。你应该检查出来。)
答案 1 :(得分:0)
你可以直接读入整数
fread(&numRecords, sizeof(numRecords), 1, file);
您需要检查系统上的sizeof(int)
,如果需要将numRecords
声明为short int
,而不是int