Taille d'un fichier différente selon la méthode
Bonjour à tous ! :)
Alors premièrement j'indique que je ne programme pas pour pc mais pour calculette. Cependant le problème auquel je suis confronté m'a tout l'air d'être une spécificité du C, c'est donc pour cela que je viens sur ce forum.
Mon but est de créer une petite librairie d'archivage à l'aide des fonctions de compression de zlib. J'ai donc un fichier source, et un fichier produit par mon programme. Je teste ensuite la taille de mes deux fichiers à l'aide de 3 fonctions différentes. Mon problème est que le résultat donné par la troisième fonction donne un résultat différent des deux autres pour le fichier output (compressé) uniquement !. 8O
La première utilise fseek() :
Code:
1 2 3 4 5 6 7 8
| long GetFileSize(FILE *f)
{
long t1 = ftell(f);
fseek(f, 0, SEEK_END); // on se place au bout
long t2 = ftell(f); // on obtient la taille du fichier
fseek(f, t1, SEEK_SET);
return t2;
} |
La deuxième utilise la structure stat :
Code:
1 2 3 4 5 6
| long GetFileSize2(const char *f)
{
struct stat s;
stat(f, &s);
return s.st_size;
} |
La troisième lit et affiche tous les caractères jusqu'à arriver à la fin du fichier :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| int dispFileData(SDL_Surface *scr, nSDL_Font *font, int px, int py, FILE *f)
{
int x;
static char tmp[256] = ""; // la taille des fichiers en question ne dépasse pas 256, donc le problème ne se situe pas là
fseek(f, 0, SEEK_SET);
for (x=0; x < 254 && !feof(f) && !ferror(f); x++) {
tmp[x] = fgetc(f);
if (!tmp[x]) tmp[x] = 1; // on remplace les 0 par des 1 parce que tmp est une chaîne de caractères
}
tmp[x] = 0; // on met un 0 à la fin pour afficher la chaîne sans erreur
nSDL_DrawString(scr, font, px, py, "::%s", tmp); // on affiche à l'écran le contenu du fichier
if (ferror(f)) wShowMsg("DEBUG", "Erreur dans la lecture du fichier compresse !"); // Message indicatif
else if (feof(f)) wShowMsg("DEBUG", "Fin lecture fichier");
return x; // on retourne le nombre d'octets lus (= taille du fichier)
} |
Je travaille avec des petits fichiers (~100 octets) pour commencer. Comment est-il possible que le fichier compressé ait une taille différente avec la 3e fonction (cela me donne un résultat plus petit : j'arrive à la fin du fichier avant de l'avoir lu en entier) ?
Merci.