从一个文件读取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没有,但我从另一个问题得到了......所以我想这也可能是问题。

+1

决定你的想法。要么你有一个文本文件,要么你有一个带有2字节二进制整数的文件。不是在同一时间。 – EJP

+0

@EJP我完全消隐并忘记我的int将以ASCII形式。 – Logan

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

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

0x0a30这是十进制2608结合这两个由buf[0] | buf[1] << 8结果。请注意,<<是按位左移运算符。

(另外,int类型的大小是在许多系统中4个字节,你应该检查了这一点。)

+0

感谢您的快速回复。有没有另外一种方式,我可以以某种方式将int的实际字节写入文件,以便我可以测试我的程序? – Logan

+0

尝试'fprintf(file,“%d”,numRecords)''。这会将'int'转换为相应的文本。如果你想写实际的字节,你可以做'fwrite'。 – nglee

+0

所以我尝试使用fprintf(文件,“%d”,numRecords)然后我在输出上运行我的代码,它现在打印出48 ...你认为这是readFile()的问题吗? – Logan

您可以直接读入整数

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

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