从文件中读取 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 字节的十六进制数字 0x30
。 0x30
加载到 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
基本上我有一个包含数字的文本文件。我将数字更改为 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 字节的十六进制数字 0x30
。 0x30
加载到 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