Utilisation de la fonction fread :la taille à lire est supérieure à celle disponible pour la lecture

StackOverflow https://stackoverflow.com//questions/10705158

  •  13-12-2019
  •  | 
  •  

Question

J'ai une question:

J'utilise fread pour lire un fichier.

typedef struct {
    int ID1;
    int ID2;
    char string[256];
} Reg;

Reg *A = (Reg*) malloc(sizeof(Reg)*size);

size = FILESIZE/sizeof(Reg);

fread (A, sizeof(Reg), size, FILEREAD);

A l'aide d'une boucle, appelez consécutivement cet appel, pour me faire lire l'intégralité de mon fichier.

Que se passera-t-il lorsque j'arriverai à la fin du fichier et que je ne parviendrai pas à lire "size" * sizeof (Reg), ou si vous n'êtes disponible que pour lire la moitié de ce montant, que se passera-t-il avec mon tableau A.Sera-t-il terminé ?La fonction retournera une erreur ?

Savoir comment le fichier a été lu par le fread through ?

Édi1 :Exactement, si la division n'est pas exacte, lorsque je lis la taille de fichier un peu plus petite, je lirai des éléments qui ne sont pas dans le fichier, je me demande avec mon vecteur de redimensionner la quantité d'octets que je peux lire ou développer une dynamique meilleure.

Était-ce utile?

La solution

peur renvoie le nombre d'enregistrements lus.Tout ce qui se trouve au-delà de cela dans votre tampon peut être mutilé, ne vous fiez pas à ces données.

Fread renvoie le nombre d'éléments complets réellement lus, ce qui peut être inférieur au nombre si une erreur se produit ou si la fin du fichier est rencontrée avant d'atteindre le nombre.

La fonction ne lira pas au-delà de la fin du fichier :l'occurrence la plus probable est que vous obtiendrez un tas de tampons complets, puis une lecture (finale) partielle du tampon, à moins que la taille du fichier ne soit un multiple exact de la longueur de votre tampon.

Votre logique doit tenir compte de cela : la taille du fichier vous donne le nombre total d'enregistrements attendu, il ne devrait donc pas être difficile d'ignorer les données de fin dans le tampon (après le dernier fread call) qui correspond à des enregistrements non initialisés.Un compteur « enregistrements restant à lire » serait une approche.

Autres conseils

fread() renvoie le nombre d'éléments qu'il pourrait lire.Vous devez donc vérifier la valeur de retour de fread() pour savoir combien d'éléments de votre tableau sont valides.

Il renverra un nombre d'éléments court ou zéro si une erreur s'est produite ou EOF a est atteint.Vous devrez utiliser feof() et ferror() dans ce cas, pour vérifier quelle condition est remplie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top