J'essaie d'apprendre C et le livre que j'utilise (Apress '' Learn C ') a un chapitre qui est terriblement déroutant sur les fonctions d'accès aléatoire. Le code suivant me confusion:Question de fonction d'accès aléatoire dans C
int GetNumberOfDinos(void) {
FILE *fp;
long fileLength;
if ((fp = fopen(kDinoFileName, "r")) == NULL)
DoError("Couldn't open file...Goodbye!");
if (fseek(fp, 0L, SEEK_END) != 0)
DoError("Couldn't seek to end of file...Goodbye!");
if ((fileLength = ftell(fp)) == -1L)
DoError("ftell() failed...Goodbye!");
fclose(fp);
return((int)(fileLength/kDinoRecordSize));
}
Je comprends le but du code, mais pas comment cet effet est atteint. La ligne fopen est facile à comprendre. Le fseek et ftell est où mes ennuis commencent. Les paramètres pour fseek sont le fichier, le décalage, puis l'un des 3 SEEK. Pourquoi la condition de cela n'est-elle pas nulle? Si le fichier existe réellement (kDinoFileName) et qu'il veut pointer vers la fin de ce fichier, pourquoi l'emplacement est-il nul? Le fichier existe et il y a des informations! Et puis je ne comprends absolument pas comment la fonction ftell finira jamais avec -1L ?? Ce code est-il plus difficile qu'il ne devrait l'être?
Il est important de noter que si un fseek échoue (par exemple en raison d'une erreur de lecture sur le support de disque), il n'y a aucune garantie quant à ce qu'un ftell() suivant sera renvoyé. Ce pourrait être un nombre qui est plausible mais faux. Si vous ne parvenez pas à détecter l'erreur sur fseek(), le programme risque d'utiliser une valeur de taille de fichier incorrecte sans avoir la moindre idée que c'est faux. – supercat
@supercat - Mais si vous regardez le code affiché par l'OP, il vérifie la valeur de retour de fseek avant d'appeler ftell, donc je ne sais pas pourquoi votre commentaire "est important à noter". Si fseek échoue, l'appel à ftell n'aura jamais lieu dans son code, donc c'est vraiment un point discutable. Je suppose ici que sa fonction DoError effectue une sorte d'appel system.exit ou termine le programme d'une autre manière. – dcp