[langage C] Probleme while et printf

Résolu/Fermé
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018 - 18 mars 2009 à 09:43
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018 - 18 mars 2009 à 18:16
Bonjour, voila j'ai un problème en c (je suis débutant) j'ai créer une boucle while et je voudrai afficher le pourcentage d'avencement de celle ci
float test=0.00;
la variable taille et connus (taille d'un fichier fseek(stor,0,SEEK_END); taille = ftell(stor) ;)
je test si le fichier existe
je me replace au debut du fichier fseek(stor,SEEK_SET,0);
et enfin jexecute ma while
int alphaa;
while((alphaa=fread(&entier, sizeof(unsigned char), 1, stor)) != 0){
f +=1;
if (taille > 0 && f > 0 ){
test = (f/taille)*100;
printf("Pourcentage d'avancement est de : %f %% \r", test);
};
et cela m'affiche dans la console sans que le 0.000000 % ne change pendant l'execution de la while
par contre il ce met a 100% a la fin de la while.
J'ai retourner le problème dans tout les sens et je n'y arrive pas quelqu'un pourrait-il m'aider merci.
ps je suis sous linux et je compile avec gcc4.2

5 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 mars 2009 à 09:52
je dirai, là comme ça, problème de type.
test = f/taille*100;
si tu fait une division d'entier, il retourne des entiers. Pour en avoir le coeur net, essai le code suivant à la place :
test = float(f)/float(taille)*100; 
0
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018
18 mars 2009 à 10:10
cela me genere une erreur du type (expected expression before ‘float’)
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
18 mars 2009 à 10:25
Beuh !
où est le souci ? Comprends pas... Test jusqu'à ce que ça compile :
test = float(f)/float(taille)*100.;
test = (float)f/(float)taille*100.;
test = ((float)f)/((float)taille)*100.;
test = (100.*f)/(1.0*taille); // celle là devrais compiler au minimum
0
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018
18 mars 2009 à 13:11
cela ma donné qui ne marche toujours pas
Voiçi le code entier et modifier
de nouvelle variable j'ai tout passer en float
int Fonction(char *buffer,char *pass, char *Cible){
FILE *stor;
stor = fopen(buffer,"rb");
FILE *ecriture;
ecriture = fopen(Cible, "wb");
long taille, i, taille_passe;
float test=0.00;
float iteration = 0.00;
float taille_f = 0.00;
int alphaa, alpha;
int f =0;

unsigned char byte;
unsigned int entier;
char* tableau_byte = NULL;
int* tableau_enier = NULL;

if (stor == 0){
printf("\nJe ne peut pas ouvrir le fichier demander\n"
"Verifier vos droit d'administration\n"
"Verifier que le fichier exister\n");
exit(EXIT_FAILURE);
}
else{
fseek(stor,0,SEEK_END);
taille = ftell(stor) ;
taille_f = ftell(stor) * 1.0;
tableau_byte = malloc((taille) * sizeof(char));
tableau_enier = malloc((taille) * sizeof(int));
if (tableau_byte == NULL) // On vérifie si l'allocation a marché ou pas
{
exit(0); // On arrête tout
}
taille_passe = strlen(pass);
//alpha = taille_passe;
if (strlen(&taille_passe) !=0){
if (taille != -1){
printf("\nLa lecture de la taille du fichier %c a réussie.\nLa taille du fichier est de %i octets",buffer,taille);
printf("\nLa lecture de mise en cache va commencer.\n");
sleep(1);
fseek(stor,SEEK_SET,0);
//Allocation de temp avec la taille du fichier

while((alphaa=fread(&entier, sizeof(unsigned char), 1, stor)) != 0){
//printf("Lecture de l'octet n° %i a pour code hexadecimal : %i \n ",f, byte);
//tableau_enier[f] = entier;
iteration +=1.000;
f = f+ 1;
alpha += 1;
if(alpha >= taille_passe){alpha=0;}
if ( f > 0 ){
test = iteration / taille_f;
printf("Pourcentage d'avancement est de : %f %% sur %i\r", test, taille);

};
};
printf("\nEcriture terminer.\n");
sleep(1);
}
else{
printf("\nLe fichier n'existe pas!");
printf("\n");
}
}
}
fclose(ecriture);
fclose(stor);
return 1;

}
Je ne vois pas ce qui cloche je demande d'afficher le pourcentage d'avancement et cela ne fonctionne pas
0
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018
18 mars 2009 à 13:26
C'est bon j'ai trouver voici le code :
float Calcul_poucentage(float taille_total, float fait){
float pour;
pour = (fait/taille_total) *100;
return pour;
};

while{ et condition etc
printf("Pourcentage d'avancement est de : %.2f %%\r", Calcul_poucentage(taille,f));
}
et cela fonctionne impeccable merci de m'avoir mis sur la piste
Ps je vais réinstaller mon compilateur et ma bib merci a +
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
18 mars 2009 à 14:14
Salut,
Oui, tu peux passer par une fonction qui va te convertir automatiquement les int en float.
Mais, comme l'a dit char snipeur, un simple cast suffit.

while{ et condition etc
printf("Pourcentage d'avancement est de : %.2f %%\r", (float)f/taille*100);
fflush(stdout);
}

Par ailleurs, n'oublie pas le fflush(stdout).

Et enfin, il n'y a pas besoin de ; après les accolades (comme
Par exemple :
float Calcul_poucentage(float taille_total, float fait){
} //pas besoin de virgule

while ( ...) {
...
} //pas besoin de virgule

Cdlt
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
xave4552 Messages postés 53 Date d'inscription dimanche 16 mars 2008 Statut Membre Dernière intervention 24 février 2018
18 mars 2009 à 18:16
ok merci
0