从文件中读取 2 个字节并转换为 int 会给出错误的输出

Reading 2 bytes from a file and converting to an int gives the wrong output

基本上我有一个包含数字的文本文件。我将数字更改为 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] << 8 确实如此,但我是从另一个问题中得到的......所以我想这也可能是问题所在。

文本文件中的数字 0 实际上将表示为 1 字节的十六进制数字 0x300x30 加载到 buf[0]。 (在ASCII table中,0表示为0x30

您在 buf[1] 中有垃圾数据,在本例中值为 0x0a。 (0x0a 在 ASCII table 中是 \n

通过 buf[0] | buf[1] << 8 将这两个组合起来得到 0x0a30,即十进制的 2608。请注意,<< 是按位左移运算符。

(此外,int 类型的大小在许多系统中为 4 字节。您应该检查一下。)

可以直接读入整数

fread(&numRecords, sizeof(numRecords), 1, file);

您需要在您的系统上检查 sizeof(int),如果它是四个字节,您需要将 numRecords 声明为 short int 而不是 int