2010-03-27 12 views
4

J'essaie d'utiliser ma propre fonction pour obtenir la taille du fichier à partir d'un fichier. Je vais utiliser cela pour allouer de la mémoire pour une structure de données pour contenir les informations sur le fichier.Fstat fait maison pour obtenir la taille du fichier, retourne toujours 0 longueur

La fonction de la taille du fichier ressemble à ceci:

long fileSize(FILE *fp){ 
    long start; 
    fflush(fp); 
    rewind(fp); 
    start = ftell(fp); 
    return (fseek(fp, 0L, SEEK_END) - start); 
} 

Toutes les idées que je fais mal ici?

Répondre

3

Do

fseek(fp, 0L, SEEK_END); 
return (ftell(fp) - start); 

au lieu de

return (fseek(fp, 0L, SEEK_END) - start); 

parce fseek retour à zéro en cas de succès non l'offset que vous attendez ici.

+0

Merci. * Je suppose que j'aurais dû passer plus de temps à lire la page de manuel. :) – Fred

1

Quelques commentaires:

  • n'appeler fflush() - votre flux peut être un flux de lecture, pour lequel fflush() entraîne un comportement non défini

  • vous n'avez pas de contrôle d'erreur!

  • fseek() renvoie 0 pour le succès - vous devez appeler ftell() pour obtenir la longueur

Modifier le code à ceci:

long fileSize(FILE *fp) 
{  
    fseek(fp, 0L, SEEK_END); 
    return ftell(fp); 
} 
+1

Bonnes suggestions, je vais les prendre avec moi. Je vous remercie. – Fred

0

Vous devez appeler ftell après fseek. Essayez:

long fileSize(FILE *fp){ 
    long start; 
    fflush(fp); 
    rewind(fp); 
    start = ftell(fp); 
    fseek(fp, 0L, SEEK_END); 
    return ftell(fp); 
} 

Il n'y a pas besoin de faire une différence, de sorte que votre premier ftell est inutile et vous pouvez vous en débarrasser. Je voudrais utiliser:

long filezise(FILE *fp) 
{ 
    fseek(fp,OL,SEEK_END); 
    // fseek(f, 0, SEEK_SET); - only if you want to seek back to the beginning 
    return ftell(fp); 
} 

De même, assurez-vous que vous ouvrez votre fichier en mode binaire.

+0

C'est génial, je ne savais pas que tu pouvais le faire. Merci! – Fred