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 !.
La première utilise fseek() :
La deuxième utilise la structure stat :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 troisième lit et affiche tous les caractères jusqu'à arriver à la fin du fichier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 long GetFileSize2(const char *f) { struct stat s; stat(f, &s); return s.st_size; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager