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

标签 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] << 8 确实如此,但我是从另一个问题中得到的......所以我想这也可能是问题所在。

最佳答案

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

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

通过 buf[0] | buf[1] << 8 将这两者结合起来结果 0x0a30这是 2608十进制。注意 <<是按位左移运算符。

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

关于c - 从文件中读取 2 个字节并转换为 int 会给出错误的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44752780/

相关文章:

c - 在 C 中以原子方式比较两个整数的最快方法?

java - android java - 保存文件对话框 GUI

android - 文件从字符串中读取换行符,而字符串上没有换行符

Java搜索文件

c# - c/c++ 类似于 c# System.ServiceModel.Channels.BufferManager

C 指针(使用指针时 int 和 char 之间的区别),示例如下?

arrays - 数组递归

c++ - 调试 fastcgi 应用程序

python - 查询 MySQL,其中 XML 为值

stack - 堆喷射、堆溢出、堆溢出有什么区别?