从一个文件读取2个字节并转换为一个int给出错误的输出
问题描述:
基本上我有一个包含数字的文本文件。我将数字更改为0开始,然后从文件中读取2个字节(因为int为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] < < 8没有,但我从另一个问题得到了......所以我想这也可能是问题。
答
您的文本文件中的数字0
实际上将表示为一个1字节的十六进制数0x30
。 0x30
加载到buf[0]
。 (在ASCII表,0
由0x30
表示)
您在buf[1]
有垃圾数据,在这种情况下,值是0x0a
。 (0x0a
是\n
在ASCII表)
在0x0a30
这是十进制2608
结合这两个由buf[0] | buf[1] << 8
结果。请注意,<<
是按位左移运算符。
(另外,int
类型的大小是在许多系统中4个字节,你应该检查了这一点。)
答
您可以直接读入整数
fread(&numRecords, sizeof(numRecords), 1, file);
您需要检查sizeof(int)
上你的系统,如果你的四个字节需要声明numRecords
为short int
而不是int
决定你的想法。要么你有一个文本文件,要么你有一个带有2字节二进制整数的文件。不是在同一时间。 – EJP
@EJP我完全消隐并忘记我的int将以ASCII形式。 – Logan