freading 2字节长整型
我读一个完整的2字节长整型文件到一个数组freading 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
,并检查fread
的确在阅读预计的项目数量。
好吧,但我实际上需要数组有整数(32位)。另外,我可能会从文件中读取不同长度的整数。 –
@AsoneTuhid对我来说,这是“高效”二进制I/O的根本问题。如果您希望能够读取大块,则您的内存数据结构必须与外部表示完全匹配。如果你不能使它们匹配(例如,如果它们具有不同的尺寸,就像你说的那样),你别无选择,只能阅读 - 并且可能做一些转换 - 在逐个元素的基础上。 –
@AsoneTuhid另外,虽然我没有提到它,但我认为你的“方法1”假定在你开始阅读之前'* arr'的所有字节都是0。否则,如果'* arr'中的整数是4个字节,而只读取2个字节,则每个整数的另外两个字节将是垃圾。 (另外,正如你可能知道的,还有字节顺序的问题。) –
使用'int16_t'或'short'。 –