Extraire une valeur décimale et l'utiliser ensuite pour calculer une valeur [Résolu]

Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
- - Dernière réponse : cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
- 9 juil. 2010 à 17:01
Bonjour,

Je suis un grand débutant en C++. Dans le cadre de mon stage, je dois faire un programme en C++ pour calculer des paramètres électriques tels que le glissement, ... à partir des données contenues dans un fichier txt.

Je veux extraie les différentes grandeurs (fréquence d'alimentation, fréquence de rotation) et les attribuer à des variables que j'utilise dans ma formule pour le calcule du glissement g du moteur.

J'ai perdu pas mal de temps. J'ai cherché dans les forums mais je trouve que des codes pour lire des lignes et l'afficher sur une console

Please, I need help!!!

Thank you!
Afficher la suite 

20 réponses

Meilleure réponse
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
3
Merci
1) N'utilise pas using namespace, jamais ! Il suffit d'écrire std::cout, au lieu de cout.
2) Un nom de variable n'a *jamais* de majuscules, par convention, seul les noms de classes en ont une.
3) Pas de variable globale ! Encore une fois, c'est la pire chose à faire.
4) Il faut vérifier si le fichier a été ouvert correctement.

A noter que les nombres doivent être séparés par des . et non des ,

Fmax 156.25
Falim 50
f(supc{S}) 50
f(supv{S}) 49.4141
N 3200
X Resolution 0.0488281
0.103938 0.068602
0.0612703 0.060891
0.0385554 0.0652896
0.0268127 0.0589976


Correction de ton code:
#include 
#include <fstream>

int main()
{
  std::ifstream file("Données.txt");
  if (!file)
  {
    std::cerr << "Impossible d'ouvrir le fichier" << std::endl;
    return 1;
  }

  std::string ignore;
  double fmax;
  file >> ignore >> fmax;
  double falim;
  file >> ignore >> falim;
  double fsupc;
  file >> ignore >> fsupc;
  double fsupv;
  file >> ignore >> fsupv;
  double n;
  file >> ignore >> n;
  double resolution;
  file >> ignore >> ignore >> resolution;

  std::cout << fmax << std::endl
    << falim << std::endl
    << fsupc << std::endl
    << fsupv << std::endl
    << fsupv << std::endl
    << n << std::endl
    << resolution << std::endl;


  float valeur1;
  float valeur2;
  while (file >> valeur1 >> valeur2)
  {
    std::cout << valeur1 << " " << valeur2 << std::endl;
  }

  float g = (falim - fsupv) / falim;
  std::cout << "Valeur du glissement : " << g << std::endl;
  file.close();

  return 0;
}

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 223 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
3
Merci
Ben oui...
L'opérateur >> fonctionne comme ceci:

Il essaie de faire correspondre les variables avec des valeurs séparés par des espaces.

Ex:

int a;
int b;
int c;
file >> a >> b >> c;


Avec:
4 5 6



Il essaiera de le coller:

4 5 6
a b c


Maintenant si tu as un texte:
Frequence d'alimentation = 1


Pour récupérer le 1, il faut coller ta variable sur le "1".
Soit:

Frequence d'alimentation = 1
.....X...........X.......X.X

Donc il faut se débarraser des trois premiers avant de pouvoir stocker le 4eme qui est ce que tu veux.

Ce qui donne:
std::string ignore;
int a;
file >> ignore >> ignore >> ignore >> a;


________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 223 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
3
Merci
Ce n'est pas vraiment du C++. Dès le moment ou tu veux dessiner quelque chose, tu dois faire appelle à des bibliothèques externes.
C'est une tout autre question. Donc, si ton problème est résolu, valide la réponse, et ouvre un nouveau sujet sur le forum.

Pour dessiner des courbes, tu peux utiliser gnu plot (facile à utiliser, si tu es sous Linux).
Ou alors prendre QT (avec QTCreator).

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 223 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Quelle est la question *précise* ?

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Merci de votre réponse,

J'ai une fichier txt qui contient 3200 lignes avec 11 colonnes et avec quelques paramétres: fréquence d'alimentation, fréquence de rotation,..., je voudrais récupérer dans un premier temps la fréquence d'alimentation et la fréquence de rotation que j'affeterai à deux variables que j'utiliserai pour évaluer le glissement g = (falim - frot)/falim.

Je n'arrive pas à extraire ces grandeurs depuis le fichier txt.

Comment faire pour les extraire et comment faire pour les utiliser ensuite pour faire le calcul en C++.

Cordialement, Merci de votre réponse.

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Comment les données sont elles écrites dans le fichier ?
Les lignes sont séparés par un délimiteur ?

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,

le format du fichier:

Fmax 156,25
Falim 50
f(supc{S}) 50
f(supv{S}) 49,4141
N 3200
X Resolution 0,0488281

C1 C2 .... C12

Les colonnes sont séparées par des tabulations et les paramètres aussi.

Après ça, je dois tracer des courbes à partir des 11 colonnes et avec colonne 1 l'axe des abscisses. Les données sont des décimales.

Cordialement,

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Ok, dans ce cas, c'est très simple à récupérer.

Tu commences par ouvrir le fichier en lecture, via un "std::ifstream".
Ensuite, les données étant séparées par des tabulations, tu peux simplement le faire entrée dans tes variables, grâce à l'opérateur ">>".

Ex:
Soit le fichier:

toto 1 1.5
titi 2 78.5
tutu 3 0.7


Pour récupérer les données, je ferais:
std::ifstream file("fichier.txt");
std::string name;
int nb;
double decimal;

while (file >> name >> nb >> decimal)
  std::cout << name << " " << nb << " " << decimal << std::endl;

file.close();


A toi de comprendre cet exemple, et de l'adapter à ton cas.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Merci beaucoup,

Je te tiendrais courant.

Bonne journée

Cordialement,

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
toto 1 1.5
titi 2 78.5
tutu 3 0.7

name >> nb >> decimal

Bonjour,

Name c'est le nom de la contenant toto, titi, tutu?
nb le nom de la colonne contenant 1, 2, 3?
Decimal le nom de la colonne contenant 1.5, 78.5, 0.7?

Quand on exécute le programme, la valeur de totO par exemple sera 1.5 et ainsi de suite?

J'ai testé le code et il affiche à la console Fmax156. Est ce que cela veut dire Fmax = 156?

Merci.
Commenter la réponse de sokpassy85
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Post ton code et une petite partie du fichier d'entrée.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,

Il n'affiche plus rien à la console à part "Appuyer sur une touche pour continuer"

Voici mon code j'ai juste ajouter es includes:

#include <cstdlib>
#include
#include <fstream>

using namespace std;

int main(int argc, char * argv[])
{
std::ifstream file("fichier.txt");
std::string Param;
double Valeurs;

while (file >> Param >> Valeurs)
std::cout << Param << " " << Valerus << std::endl;

file.close();

system("PAUSE");
return EXIT_SUCCESS;

}

Sais-tu pourquoi il n'affiche rien?

Merci.

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
Jamais de "using namespace std;", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

Je ne sais pas, tu ne m'a pas donné le fichier d'entrée ! (fichier.txt)

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Les premières lignes du fichiers d'entrées.

Fmax 156,25
Falim 50
f(supc{S}) 50
f(supv{S}) 49,4141
N 3200
X Resolution 0,0488281

Les 3200 lignes de données et 11 colonnes.
Données1 Données 2 ..... Données11
0,103938 0,068602 .
0,0612703 0,060891
0,0385554 0,0652896
0,0268127 0,0589976 .

Nos messages se sont croisés.

Merci,

Ibrahima.
Commenter la réponse de sokpassy85
Messages postés
3801
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 novembre 2019
90
0
Merci
C'est normal !
Tu ne peux pas utiliser la même méthode pour récupérer toutes les lignes.
Donc tu ne dois faire ta boucle qu'après.

Pour résumer:
std::string ignore; // En fait, la première colonne est descriptive, et je n'ai pas l'impression que tu t'en serves, donc on va l'appeler "ignore", et elle ne sera là que pour "matcher" ce que l'on veut. On ne s'en reservira pas.

int fmax;
file >> ignore >> fmax;
int supc;
file >> ignore >> supc;

etc... jusqu'à "X Resolution 0,0..."

Puis tu fais une boucle pour récupérer toutes les coordonnées.

________________________________________________________________________
Historique de mes créations, et quelques articles:[ http://0217021.free.fr/portfolio
http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée quand un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,
Il parait que ma boucle est fausse

G essayé de calculer le glissement en utilisant quelques paramètres mais le résultat obtenu est erroné.

voici mon code:

// Ignore le nom de la colonne des paramétres
// Valeurs le nom de la colonne des valeurs des paramétres


#include <cstdlib>
#include
#include <fstream>
#include <cstdlib>
#include <math.h>
using namespace std;
float g;
int main(int argc, char *argv[])
{
std::ifstream file("Données.txt");
std::string Param;
float Valeurs;
double Fmax;
file >> Ignore >> Valeurs >> Fmax;
double Falim;
file >> Ignore >> Valeurs >> Falim;
double Fsupc;
file >> Ignore >> Valeurs >> Fsupc;
double Fsupv;
file >> Ignore >> Valeurs >> Fsupv;
while(file >> Ignore >> Valeurs )
{
std::cout << Ignore << "" << Fmax << Valeurs << std::endl;
std::cout << Ignore << "" << Falim << Valeurs << std::endl;
std::cout << Ignore << "" << Fsupc << Valeurs << std::endl;
std::cout << Ignore << "" << Fsupv << Valeurs << std::endl;
}
g = (Falim-Fsupv)/Falim;
cout<<"Valeur du glissement : "<<g<<endl;
file.close();
system("PAUSE");
return EXIT_SUCCESS;

}

Est correct mon code?

Merci,

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,

Quand je supprime le "using namespace std", j'obtiens plusieurs erreurs. Par exmple "cout" undeclared.

J'ai lu étudié le lien que tu m'as donné mais je n'arrive à remplacer le "using namspace std".

Merci,

Ibrahima
Commenter la réponse de sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,

J'ai fait du std::cout << "Frequence d'alimentation : "<< falim << std::endl; pour voir la valeur que proramme lise: Frequence d'alimentation = 1. 12398e+292 au lieu de 50.

Sais tu pourquoi?

J'ai changé les virgules avec des points.

Cordialement
Commenter la réponse de sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
Bonjour,

Merci beaucoup, je crois je pouvais m'en sortir. J'ai réussi à afficher la bonne valeur (fmax = 15,25) en fasaint: file >> ignore >> ignore >> fmax.

Pour les 4 autres paramètres j'y travaille. Je vais arriver.

Merci merci.

Je te tiendrai courant de mon avancement.

Bon week end!
Commenter la réponse de sokpassy85
Messages postés
64
Date d'inscription
lundi 28 avril 2008
Statut
Membre
Dernière intervention
25 novembre 2014
0
Merci
C'est bon, j'ai réussi à obtenir les bonnes valeurs en suivant tes conseils.

Connais tu des tutoriels en C++ pour tracer des courbes toujours depuis un fichier txt avec 12 colonnes.

Colonne1 représente l'axe des abscisses (x) et les autres axes des ordonnées (y1, y2, ... yn).


Merci, j'ai rattrapé le temps que j'avais perdu.

Merci

Bon week end.
Commenter la réponse de sokpassy85