[C] utiliser un nombre stocké dans un fichier

utiliser un nombre stocké dans un fichier [C] - C - Programmation

Marsh Posté le 22-04-2007 à 16:00:14    

Salut tout le monde,
 
Dans un fichier j'ai memorisé une liste de "nb_valeurs" nombre du style :
0.1234
0.5687
0.3214
0.0256

 
Je voudrais les réutiliser et en calculer la moyenne. J'ai donc fait :
 

Code :
  1. float calcul_moyenne (int nb_valeurs)
  2.     {
  3.         FILE* monfichier;
  4.         monfichier= fopen ("poisson.doc","r" );
  5.         int i;
  6.         int nombre[5];
  7.         float somme=0;
  8.         for (i=0;i<nb_valeurs; i++)
  9.             {
  10.                 somme= somme + fscanf(monfichier, "%.4f",&nombre);   // jpense que je peux pas vraiment  
  11.                                                                   // ecrire ca comme ca, si ?
  12.             }
  13.         return (somme/(nb_valeurs));
  14.     fclose(monfichier);
  15.     }


 
J'ai lu aussi que je pouvais utiliser quelque chose comme fgets mais ici j'ai des nombres et pas une chaine de caracteres...  
 
Des suggestions ?

Message cité 1 fois
Message édité par cyber81 le 22-04-2007 à 16:03:20
Reply

Marsh Posté le 22-04-2007 à 16:00:14   

Reply

Marsh Posté le 22-04-2007 à 16:07:42    

y a des focntions de conversion de chaine a d'autres type, comme atoi() qui transforme en integer


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 22-04-2007 à 16:10:56    

zecrazytux a écrit :

y a des focntions de conversion de chaine a d'autres type, comme atoi() qui transforme en integer


 
strtod()


---------------
You get so used to things the way they are. And I've always been alone. I guess that makes me lonely.
Reply

Marsh Posté le 22-04-2007 à 16:14:09    


qui transforme en double :)
 
voilà de quoi avancer :)


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Marsh Posté le 22-04-2007 à 16:27:47    


Code :
  1. float calcul_moyenne (int nb_valeurs)
  2.     {
  3.         FILE* monfichier;
  4.         monfichier= fopen ("poisson.doc","r" );
  5.         int i;
  6.         float nombre;
  7.         float somme=0;
  8.         for (i=0;i<nb_valeurs; i++)
  9.             {
  10.                 fscanf(monfichier, "%.4f",&nombre);
  11.                 somme= somme + nombre;
  12.             }
  13.         return (somme/(nb_valeurs));
  14.     fclose(monfichier);
  15.     }


Reply

Marsh Posté le 22-04-2007 à 16:58:54    

contrôle la valeur retournée par fscanf

Reply

Marsh Posté le 22-04-2007 à 17:45:01    

j'ai controlé l'evolution de la somme et de la valeur de fscanf mais ca reste bloqué a 0, ou ca met n'importe quoi...  
 
Si j'ai bien compris strtod () transforme un nombre en chaine de caracteres? Le pb c'est qu'apres je vais devoir l'utiliser comme nombre...
 
merci pour toute vos reponses entouKa :) , ca m'eclaire un peu plus.

Reply

Marsh Posté le 22-04-2007 à 18:01:04    

cyber81 a écrit :


Si j'ai bien compris strtod () transforme un nombre en chaine de caracteres?


Non c'est le contraire. Si tu tiens vraiment à travailler avec des float et non des double (ou que t'as pas le choix), c'est strtof().


---------------
You get so used to things the way they are. And I've always been alone. I guess that makes me lonely.
Reply

Marsh Posté le 22-04-2007 à 21:47:27    

cyber81 a écrit :

j'ai controlé l'evolution de la somme et de la valeur de fscanf mais ca reste bloqué a 0, ou ca met n'importe quoi...

 
fscanf te renvoie le nombre de valeurs qu'il a stockées. Si ça te donne "0" alors que manifestement tu veux stocker une valeur, il y a un problème...
 

cyber81 a écrit :

Si j'ai bien compris strtod () transforme un nombre en chaine de caracteres?


Ben non. "strtod" se lit "str(ing) to d(ouble)" donc chaîne vers nombre donc ça transforme une chaîne en nombre !!!
 

cyber81 a écrit :

Dans un fichier j'ai memorisé une liste de "nb_valeurs" nombre du style :
0.1234
0.5687
0.3214
0.0256

 
Je voudrais les réutiliser et en calculer la moyenne. J'ai donc fait :
 

Code :
  1. float calcul_moyenne (int nb_valeurs)
  2.     {
  3.         FILE* monfichier;
  4.         monfichier= fopen ("poisson.doc","r" );
  5.         int i;
  6.         int nombre[5];
  7.         float somme=0;
  8.         for (i=0;i<nb_valeurs; i++)
  9.             {
  10.                 somme= somme + fscanf(monfichier, "%.4f",&nombre);   // jpense que je peux pas vraiment  
  11.                                                                   // ecrire ca comme ca, si ?
  12.             }
  13.         return (somme/(nb_valeurs));
  14.     fclose(monfichier);
  15.     }



Il n'y a aucune cohérence dans ce que t'écris
1) pourquoi tu prépares un tableau de 5 nombres alors que, manifestement, tu n'en utilises qu'un seul dans ta boucle ???
2) un tableau de 5 "int" pour stocker des nombres à virgule flottante  ??? :sarcastic:  
3) "&nombre" dans ton fscanf montre que vraiment tu ne sais pas que "nombre" est un tableau. C'est pourtant écrit 3 lignes au dessus !!!
4) somme=somme+fscanf(...) => finallement, on se demande de plus en plus à quoi sert la variable (ou le tableau) "nombre" que tu n'utilises en fait jamais
 

cyber81 a écrit :

J'ai lu aussi que je pouvais utiliser quelque chose comme fgets mais ici j'ai des nombres et pas une chaine de caracteres...


Ton fichier contient les éléments suivants
'0' '.' '1' '2' '3' '4' '\n' '0' '.' '5' '6' '8' '7' '\n' '0' '.' '3' '2' '1' '4' '\n' '0' '.' '0' '2' '5' '6' '\n'
 
Tels que je te les affiche, c'est bien une suite de caractères non ??? Que la commande "cat" (Unix/Linux) ou "type" (Windows) te les affiche bien proprement ligne par ligne (chaque ligne calée sur le '\n') n'est qu'un effet d'affichage. Et que ces suites de caractères représentent des nombres dans ta tête n'est qu'une adaptation que fait ton cerveau de ce qu'il voit => Pour l'ordinateur, ce ne sont que des caractères !!!
 

cyber81 a écrit :

Des suggestions ?


Oui. Commence par bien comprendre ce que contient ton fichier... et comment fonctionnent les fonctions que t'invoques (le C n'est pas de la sorcellerie). Un petit peu de jugeotte algorithmique par dessus (inutile de déclarer un tableau si on n'utilise qu'un nombre à la fois) et tout ira beaucoup mieux...


Message édité par Sve@r le 28-04-2007 à 19:26:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed