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

时间:2017-06-26 03:31:24

标签: c file buffer fopen fread

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

2 个答案:

答案 0 :(得分:3)

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

您在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