2010-09-13 10 views
1

Je veux lire quelques données du fichier, les données auront des tailles différentes à des moments différents.fread() size argument

Si je le code ci-dessous, puis:

char dataStr[256]; 

fread(dataStr, strlen(dataStr), 1, dFd); 

fread est de retour 0 pour l'appel ci-dessus et ne pas lire quelque chose à partir du fichier. Mais, si je donne la taille à 1, alors il lit avec succès un char à partir du fichier.

Quelle devrait être la valeur de l'argument size à la fonction fread() lorsque l'on ne sait pas quelle est la taille des données dans le fichier?

Répondre

1

Vous devez utiliser:

fread(dataStr, 1, sizeof dataStr, dFd); 

pour indiquer que vous voulez lire le nombre d'octets égal à la taille de votre mémoire tampon de tableau.

La raison pour laquelle votre code ne fonctionne pas est que strlen() trouve la longueur d'une chaîne à terminaison NULL , pas la taille de la mémoire tampon. Dans votre cas, vous l'exécutez sur un tampon non initialisé et avez simplement de la chance, votre premier octet dans le tampon est NULL, donc strlen(dataStr) renvoie 0, mais est tout aussi susceptible de planter ou renvoyer un nombre aléatoire supérieur à votre taille de tampon.

Notez également que fread() retourne le nombre de articles lecture, et non le nombre de caractères (j'ai troqué la deuxième et troisième arguments de telle sorte que chaque caractère est équivalent à un élément).

3

strlen compte le nombre de caractères jusqu'à ce qu'il frappe \ 0.
Dans ce cas, vous avez probablement tapé \ 0 sur le premier caractère, donc strlen renvoie 0 comme longueur et rien n'est lu. Vous devez utiliser sizeof au lieu de strlen.

2

Vous ne pouvez pas faire cela, évidemment.

Vous pouvez lire jusqu'à un délimiteur connu, souvent un saut de ligne, en utilisant fgets() pour lire une ligne. Ou vous pouvez lire un nombre d'octets connu à l'avance, en utilisant cet argument.

Bien sûr, s'il y a une limite supérieure pour la quantité de données, vous pouvez toujours la lire, puis inspecter les données pour voir ce que vous avez.

En outre, dans votre exemple, vous utilisez strlen() sur l'argument qui va être remplacé, ce qui implique qu'il contient déjà une chaîne correcte de la même taille que les données qui vont être lues. Cela semble improbable, vous voulez probablement dire sizeof dataStr là.

-2

fread renvoie le nombre de numblocks lus avec succès. Vous pouvez:

if(1==fread(dataStr, 256, 1, dFd)) 
    puts("OK"); 

Il lit jamais la longueur de vos données définies; fread ne peut pas casser '\ 0'.

+0

Le problème auquel je fais face est que je ne sais pas exactement quelle est la taille des données dans le fichier. (Le fichier aura fondamentalement un nombre comme contenu, donc il peut être 8 ou 3445 ou n'importe quel autre nombre). Maintenant ce qui se passe est le il lit des ordures après avoir lu le nombre quand j'ai donné sizeof comme argument de taille. Comment puis-je lire les données exactes (dans ce numéro de cas) sans connaître ses tailles à partir du fichier. – vikas