在块中读取 2 字节长的整数

freading 2-byte-long ints in blocks

我正在将一个充满 2 字节长整数的文件读入一个数组

FILE *f = fopen("file.bin", "rb");
int *arr;
int len = 2;

这个有效:

// method 1
for (int i = 0; i < numberOfElements; i++)
     fread(arr + i, len, 1, f);

我希望它以同样的方式工作:

// method 2
fread(arr, len, numberOfElements, f);

目标是提高性能。

如果您正在读取一堆 2 字节整数,则需要将它们读入一个 2 字节整数数组。最直接的方法是使用 <stdint.h> 中的标准类型 int16_t。你会想要这样的东西:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <assert.h>

FILE *f = fopen("file.bin", "rb");
int16_t *arr;
int len = 2;

assert(sizeof(*arr) == len);

arr = malloc(numberOfElements * len);

if(arr == NULL) {
    fprintf(stderr, "malloc failed\n");
    exit(1);
}

int r = fread(arr, len, numberOfElements, f);

if(r != numberOfElements) {
    fprintf(stderr, "incorrect number of items read\n");
    exit(1);
}

您会注意到我添加了分配 arr 的代码,检查 malloc 是否成功,检查我们选择的类型是否匹配 len,并检查 [=16] =] 实际上确实读取了预期的项目数。