2015-11-17 2 views
-2

Je travaille en C et j'essaie de lire une image du système de fichiers (par exemple: name.IMA) et j'en ai besoin sous forme binaire car j'ai besoin de le lire octet par octet. Quelle est la bonne façon de lire ces types de fichiers en C? Le ci-dessous ne fonctionne pas:Comment fopen() un fichier .IMA?

FILE *filePointer = fopen("name.IMA","rb"); 
fread(buffer, fileLength, 1, filePointer); 

PRINCIPAL PROBLEME: Le fread() ouvre réellement et la lecture comme prévu. La confusion est due au fait que la valeur de retour donnée par fread() est pour une raison quelconque égale à 1 (même si plus d'un octet a été lu). Quel est le problème ici?

+0

À quoi 'fileLength' est-il initialisé? Comment avez-vous choisi cette valeur? Avez-vous testé la valeur renvoyée par 'fopen()'? Celui qui est retourné par 'fread()'? –

Répondre

2

Si votre ligne fread ne répond pas à vos attentes, je vérifierais tout ce que fileLength est configuré pour. Si c'est plus d'octets que ce qui peut être lu, le fread renverra zéro.

Une chose que vous devez garder à l'esprit est que fread() renvoie le nombre de articles lecture, pas le nombre de octets (souligné):

size_t fread (void *ptr, size_t size, size_t nmemb, FILE *stream);

En cas de succès, fread() retourner le nombre de articles lire. Ce nombre est égal au nombre d'octets transférés ne lorsque la taille est 1.

Donc, il y a une différence entre ces deux:

size_t n = fread (buffer, s, 1, fp); 
size_t n = fread (buffer, 1, s, fp); 

La première est la lecture jusqu'à un élément de taille s donc ne retournera jamais zéro ou un. La seconde est la lecture à s éléments de taille 1 peut donc retourner une valeur de 0..s inclusivement.

Le dernier est celui que vous voulez utiliser si vous voulez lire autant d'octets à un moment que vous pouvez tenir dans un tampon:

char buff[128]; 
size_t sz; 
FILE *fp = fopen ("name.ima", "rb"); 
if (fp != NULL) { 
    while ((sz = fread (buff, 1, sizeof (buff), fp)) > 0) 
     doSomethingWith (buffer, sz); 
    fclose (fp); 
} 
+0

Bon, alors voici la situation. Le fread() s'ouvre réellement et lit comme prévu. La confusion est due à la valeur de retour donnée par fread() pour une raison quelconque (même si plus d'un octet a été lu). Quel est le problème ici? – Vimzy

+1

@Vimzy, vous avez spécifié de lire * un * élément de taille 'fileLength'. 'fread()' renvoie le nombre d'éléments * lus, pas le nombre d'octets.Si vous échangez les arguments ainsi 'fread (buffer, 1, fileLength, filePointer)', vous demandez à lire les éléments 'fileLength' de taille 1, et vous obtiendrez le nombre d'octets lus. – paxdiablo

+0

Une dernière précision, le fread() insère-t-il un terminateur null à la fin du buffer? Le tampon est un pointeur de ints (fait en utilisant malloc)? – Vimzy

0

Votre fread retourne 1 car il est invité à lire un seul élément

size_t fread (void * ptr, size_t size, size_t count, FILE * stream); 

Dans votre cas, vous définissez le nombre d'être 1. Voilà pourquoi sa lecture seule un élément-à-dire un octet

De plus, vous définissez la taille à fileLength, ce qui est faux. taille représente la taille de chaque élément.

+0

Juste un pointeur: un élément n'est qu'un octet lorsque la taille est 1, ce qui n'est pas le cas dans le texte suivant. Sinon, ce sera plusieurs octets de long. En fait deux nitpicks car il est parfaitement acceptable d'avoir un élément de la même taille que le fichier si vous voulez simplement charger atomiquement le fichier entier. Il y a des cas où vous devriez charger des éléments individuellement mais je ne pense pas que ce soit l'un d'entre eux. – paxdiablo