在块中读取 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] =] 实际上确实读取了预期的项目数。
我正在将一个充满 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] =] 实际上确实读取了预期的项目数。