[langage C] Probleme while et printf [Résolu/Fermé]

Signaler
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018
-
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018
-
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

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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; 
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018

cela me genere une erreur du type (expected expression before ‘float’)
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 247
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
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018

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
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018

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 +
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 736
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
Messages postés
53
Date d'inscription
dimanche 16 mars 2008
Statut
Membre
Dernière intervention
24 février 2018

ok merci