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() :
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 deuxième utilise la structure stat :
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;
}
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
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.