首页 文章

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

提问于
浏览
0

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

2 回答

  • 0

    你可以直接读入整数

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

    您需要检查系统上的 sizeof(int) ,如果需要将其四个字节声明 numRecordsshort int 而不是 int

  • 3

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

    您在 buf[1] 中有垃圾数据,在这种情况下,值为 0x0a . ( 0x0a 在ASCII表中是 \n

    将这两个结合起来 buf[0] | buf[1] << 8 会产生 0x0a30 ,即十进制的 2608 . 请注意 << 是按位左移运算符 .

    (此外, int 类型的大小在许多系统中都是4字节 . 你应该检查出来 . )

相关问题