2017-09-23 12 views
0

Je lis un fichier complet de ints 2 octets de long dans un tableaufreading 2 octets de long ints dans les blocs

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

Cela fonctionne:

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

Je veux que ce travail de la même manière:

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

Le but est d'augmenter les performances.

+0

Utilisez 'int16_t' ou' short'. –

Répondre

1

Si vous lisez un nombre d'octets de 2 octets, vous devez les lire dans un tableau de 2 octets. Le moyen le plus simple est d'utiliser le type standard int16_t de <stdint.h>. Vous voulez quelque chose comme ceci:

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

Vous remarquerez que j'ai ajouté du code à allouer arr, vérifiez que malloc réussi, vérifiez que le type nous avons choisi matchs len, et vérifier que fread ont en fait lire la nombre d'articles attendus.

+0

Ok mais j'ai vraiment besoin du tableau pour avoir des ints (32 bits). En outre, je pourrais lire des nombres de longueurs variables du dossier. –

+0

@AsoneTuhid Pour moi, c'est le problème fondamental des E/S binaires "efficaces". Si vous voulez pouvoir lire en gros blocs, votre structure de données en mémoire doit correspondre exactement à la représentation externe. Si vous ne pouvez pas les faire correspondre (par exemple, si elles ont des tailles différentes, comme vous le dites), vous n'avez pas d'autre choix que de lire - et éventuellement de faire des conversions - élément par élément. –

+0

@AsoneTuhid Aussi, bien que je ne l'ai pas mentionné, je pense que votre "méthode 1" suppose que tous les octets de '* arr' sont 0 avant de commencer à lire. Sinon, si les ints dans '* arr' sont, disons, de 4 octets alors que vous lisez seulement dans 2 octets, les deux autres octets de chaque int vont être garbage. (De plus, comme vous le savez probablement, il y a le problème de l'ordre des octets.) –