Question

Quand je lance mon programme et je choisis de voir la liste de produits, il n'a pas d'imprimer quoi que ce soit.Après un certain temps, je trouve que la valeur de fl_size est toujours 0.Pourquoi est-ce?

void view_prdct_code_list() {
        FILE *stock = fopen("stock.dat","r+");
        assert(stock);

        int fl_size=ftell(stock);
        int prd_size= sizeof(product);
        int quantity= fl_size/prd_size;
        printf("fl_size=%d",fl_size);

        fseek(stock,0,SEEK_SET);
        prdct cprd= (product *)malloc (sizeof(product)*quantity);
        assert(cprd);

        int i;

        fread(cprd,prd_size,quantity,stock);

        for (i=0;i<quantity;i++){
                printf("PRODUCT CODE: %d\n",cprd->code);
        }

        free(cprd);
        fclose(stock);
}
Était-ce utile?

La solution

ftell ne retourne pas la taille totale du fichier;il renvoie en cours lire ou écrire position dans le fichier.Vous appelez ftell immédiatement après l'ouverture du fichier, de sorte que la position est le début du fichier.Vous pouvez soit utiliser fseek(stock, 0, SEEK_END) rechercher à la fin avant d'appeler ftell, ou vous pouvez déposer une couche et l'utilisation fstat(fileno(stock)) pour récupérer la taille du fichier directement à partir de l'OS.

Note en outre:

  1. Aucune de ces options va fonctionner, si vous lisez à partir d'un tuyau.(En général, vous devez vérifier pour la réussite de tous seul de vos fichiers les opérations d'accès.)
  2. fread n'est pas garanti pour lire l'intégralité du fichier en un clin d'oeil, même si vous le demandez.
  3. Comme "alk", fait remarquer, ftell retourne un long, pas un int.
  4. Vous devez être l'ouverture de cette apparence-un fichier binaire avec mode "r+b".
  5. Les fichiers binaires sans en-tête du fichier (et en particulier sans nombre magique, d'au moins quatre octets, au décalage de zéro) sont une Mauvaise Chose.
  6. Ne pas jeter la valeur de retour de malloc.(Il est nécessaire de le faire en C++, mais en C, il n'est pas seulement inutile, il peut se cacher des bugs.)

Autres conseils

Vérifiez la page de man pour ftell, par exemple celui-ci: http://linux.die.net/man/3/ftell

Voici la partie pertinente: "La ftell() la fonction obtient la valeur actuelle du fichier indicateur de position pour le flux pointé par stream".

Lorsque vous ouvrez le fichier, la position du curseur seront au départ.Si la distance à partir de départ sera égale à zéro.Donc ftell renvoie zéro.

Pour trouver la taille de fichier, voir ce lien: Comment puis-je obtenir un fichier de taille en C?.Voici un extrait en bref:

fseek(fp, 0L, SEEK_END);
sz = ftell(fp);

Assurez-vous d'appeler fseek(fp, 0L, SEEK_SET); après ci-dessus.

Parce que ftell retourne la taille du début à la position courante du fichier.

fseek(stock,0,SEEK_SET);

Signifie que vous définissez la position de la première bouchée du fichier.

Aussi tu dois définir fl_size=ftell(stock); après l' fseek.

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