2017-09-23 179 views
0

我讀一個完整的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'。 –

回答

1

如果您正在讀取一串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個字節,則每個整數的另外兩個字節將是垃圾。 (另外,正如你可能知道的,還有字節順序的問題。) –