freading 2字节长整型

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); 

目标是提高性能。

+0

使用'int16_t'或'short'。 –

如果您正在读取一串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的确在阅读预计的项目数量。

+0

好吧,但我实际上需要数组有整数(32位)。另外,我可能会从文件中读取不同长度的整数。 –

+0

@AsoneTuhid对我来说,这是“高效”二进制I/O的根本问题。如果您希望能够读取大块,则您的内存数据结构必须与外部表示完全匹配。如果你不能使它们匹配(例如,如果它们具有不同的尺寸,就像你说的那样),你别无选择,只能阅读 - 并且可能做一些转换 - 在逐个元素的基础上。 –

+0

@AsoneTuhid另外,虽然我没有提到它,但我认为你的“方法1”假定在你开始阅读之前'* arr'的所有字节都是0。否则,如果'* arr'中的整数是4个字节,而只读取2个字节,则每个整数的另外两个字节将是垃圾。 (另外,正如你可能知道的,还有字节顺序的问题。) –