Découpage ligne et stockage dans un vecteur [Résolu/Fermé]

Signaler
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018
-
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
-
Bonjour tt le monde,

j'ai un fichier qui contient deux valeurs de type double séparés par un point virgule.
à l'aide de getline(), j'ai pu lire mon fichier.
maintenant je cherche à découper cette ligne en fonction de mon délimiteur (le point virgule).
comment je peux faire pour découper cette ligne et stocker le résultat dans un vecteur en utilisant c++?
je reste dipso pour plus de détail

Merci

31 réponses

Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

Re-bonjour,

Svp j'ai un autre pb, dsl pour ttes ces questions mais vraiment j'ai besoin d'aide.
Pour la deuxième étape de mon projet je dois définir qlq fonctions et de les appliquer sur le tableau que j'ai créé à partir du fichier.csv.
J'ai définit une fonction "Mutual_inductance" comme suit:

le .h:
#ifndef MUTUAL_INDUCTANCE_H_INCLUDED
#define MUTUAL_INDUCTANCE_H_INCLUDED

void Mutual_inductance(double freq,double R1,double R2,double R3,double L1,double L2,double L3,double Le1,double Le2,double Le3);

#endif // MUTUAL_INDUCTANCE_H_INCLUDED


le .cpp:
#include "Mutual_inductance.h"
#include <math.h>
#include <complex>

void Mutual_inductance(double freq, double R1,double R2,double R3,double L1,double L2,double L3,double Le1,double Le2,double Le3)
{
    const double pi =3.141592653589793238463;
    double w = 2*pi*freq;
    std::complex M12= sqrt(-Le1*(R2^2)/(L2*(w^2)) - Le1*L2 + L1*(R2^2)/(L2*(w^2)) + L1*L2);
    std::complex M13 = sqrt(-Le2*R3^2)/(L3*(w^2)) - Le2*L3 + L1*(R3^2)/(L3*(w^2)) + L1*L3);
    std::complex M23 = sqrt(-Le3*(R3^2)/(L3*(w^2)) - Le3*L3 + L2*(R3^2)/(L3*(w^2)) + L2*L3);
}


lorsque j'ai tourné mon code, il y a un msg d'erreur qui est affiché : "missing Template arguments before 'M12' " de mm pour M13 et M23.
j'ai pas compris qu'est ce que ça veut dire ce msg !!

Je serai reconnaissante si vous pouvez m'expliquer ce msg d'erreur

Merci
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Voici les soucis:
- std::complex n'existe pas, c'est std::complex<ton_type> qui existe. Donc ici tu veux des std::complex<double> (c'est ça le "missing template arguments", tu ne donnes pas le paramètre du template).
- Pas besoin de pi, tu peux utiliser la constante M_PI qui existe déjà.
- L'opérateur "a^b" ne fait pas une puissance, mais un "OU binaire". Pour faire une puissance on utilise std::pow(a, b). Ici, comme tu mets au carré, tu peux directement écrire a*a.

Quelques autres conseils:
- Utilise < code cpp> au lieu de < code>, sinon pas de couleur (c'est moi qui suit obligé de le rajouter à chaque fois sur tes posts, merci de le faire la prochaine fois).
- Une variable, une fonction commencent généralement par une minuscule. La majuscule est plutôt pour un nom de classe.
- Un header en C++ prend l'extension .hpp ou .hh, le .h étant réservé au C.
- Inclus des headers du C avec un "c" plutôt qu'un .h, exemple: cmath plutôt que math.h, cstdlib plutôt que stdlib.h, etc...

Quelque chose comme ceci, serait mieux:
#include <complex>
#include <cmath> // never math.h

void mutualInductance(double freq, double r1, double r2, double r3, double l1, double l2, double l3, double le1, double le2, double le3)
{
  const double w = 2 * M_PI * freq;
 // I would put something like: const double w2 = w*w, to avoid recomputing w*w 6 times...
  std::complex<double> m12 = sqrt(-le1*(r2*r2)/(l2*(w*w)) - le1*l2 + l1*(r2*r2)/(l2*(w*w)) + l1*l2);
  std::complex<double> m13 = sqrt(-le2*(r3*r3)/(l3*(w*w)) - le2*l3 + l1*(r3*r3)/(l3*(w*w)) + l1*l3);
  std::complex<double> m23 = sqrt(-le3*(r3*r3)/(l3*(w*w)) - le3*l3 + l2*(r3*r3)/(l3*(w*w)) + l2*l3);
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

Bonjour,

Je vous remercie pour les conseils et dsl pour les codes non colorés, la prochaine fois je vais utiliser <code cpp>.
Pour la fonction "mutualInductance" elle marche très bien merci beaucoup :)
Enfin, j'ai une petite question concernant les fichiers csv, est ce que vous avez utilisé la biblio Boost pour la lecture de ce genre de fichier, le découpage des lignes et le stockage des valeurs dans un vect??

Bonne journée :)
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
J'utilise Boost assez souvent, mais pas forcément pour tout. Pour lire des CSV, il y a des solutions à base de boost::spirit, mais les performances sont mauvaises :(.
Si je dois lire rapidement et massivement des CSV, j'aime bien ce petit projet qui a de très bonnes performances:
https://github.com/ben-strasser/fast-cpp-csv-parser

Boost possède de très bon outils, mais certains sont lents :(. Boost est un composé de nombreuses bibliothèques, certaines très bonnes, et d'autres moins. Par exemple, tu pourrais utiliser boost::split pour faire ce que tu veux, mais c'est assez lent.
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

en fait j'ai installé " boost Library" pour faire un chemin d'accès dynamique à mon fichier du coup j'ai pensé à utiliser cette biblio pour spliter le fichier
bref je sais pas quoi utiliser !!
apprendre le chinois est plus facile que programmer pour moi :(
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
un chemin d'accès dynamique à mon fichier

Tu veux dire demander le fichier à l'utilisateur ? Soit juste un std::cin, non ?

Pour le CSV, utilise le projet dont je t'ai mis le lien, ou fais le "à la main" comme tu as fait actuellement.

Sur le projet que tu utilises actuellement, je ne vois pas la nécessité de recourir à boost (je ne parle que de ce que tu as posté).
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

je vais t'expliquer qu'est ce que je voulais dire par un chemin d'accès dynamique:

en fait l'idéal pour mon projet est d'ouvrir une boite de dialogue permettant de sélectionner le fichier csv à traiter, du coup le prog en déduire le chemin d'accès du fichier cible

j'espère que mon explication est claire !
Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Ce n'est pas possible en C++ (et tous les langages d'ailleurs). Les fenêtres graphiques ne sont pas liées au C++ (qui n'a pas la notion d'affichage graphique), mais plutôt à l'OS. Cela veut dire que dès le moment où tu veux une interface graphique (et non une application console), tu es obligé de recourir à un framework de fenêtrage.
En C++, on utilise généralement Qt: https://www.qt.io/download (choisir la version open source).

En revanche, utiliser une application graphique va changer radicalement la manière de coder, et un temps d'apprentissage supplémentaire est nécessaire.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

d'accord !!! ça sera très difficile pour une débutante comme moi :)
Messages postés
29
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
6 décembre 2018

j'ai une autre interrogation stp :)
après la lecture du fichier , on a obtenu une matrice. Maintenant j'ai intérêt à utiliser la biblio Eigen vu que je vais appliquer des opérations algébriques sur cette matrice (diagonalisation, calcul vecteurs et valeurs propres ...)
j'ai ajouté une variable de type MatrixXd dans mon code et j'ai essayé d'affecter la matrice que j'ai obtenu à partir du fichier cvs dans cette variable mais ça n'a pas fonctionné !!
cette affectation n'est pas faisable ?
 
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include <fstream>
#include <clocale>
#include <cmath>
#include "EigenResources\Eigenvalues"

using namespace Eigen;

template <class charT, charT sep>
class punct_facet: public std::numpunct<charT> {
protected:
  charT do_decimal_point() const { return sep; }
};

double comaStod(std::string const& s)
{
  std::istringstream iss(s);
  iss.imbue(std::locale(std::cout.getloc(), new punct_facet<char, ','>));
  double d;
  if (!(iss >> d))
    throw std::invalid_argument("invalid double");

  return d;
}

int main()
{
  MatrixXd ma_matrice;
  const std::string filename = "Measurements.csv";
  std::ifstream file(filename);  // on ouvre en lecture

  if (!file)
  {
    std::cerr << "Can't open file " << filename << std::endl;
    return 1;
  }
  std::string line; // déclaration d'une chaîne qui contiendra la ligne lue
  std::vector<std::vector<double>> array;
  while (std::getline(file, line)) // on met dans "line" la ligne
  {
    std::vector<double> v;
    std::string field;
    std::stringstream ss(line);
    while (std::getline(ss, field, ';'))
    {
      try
      {
        v.push_back(comaStod(field));
      }
      catch (std::invalid_argument& e)
      {
        std::cerr << "Can't convert " << field << " to double (" << e.what() << ")" << std::endl; //•cerr est la sortie standard des erreurs
        continue;
      }
    }
    if (!v.empty())
      array.push_back(v);
  }

  //affichage (deux boucles for)
  std::cout << "Vec:\n";
  for (size_t i=0; i<array.size(); ++i)
    {
        for (size_t j=0; j<array[i].size(); ++j)
        {
            // std::cout << array[i][j] << " ";
            ma_matrice = array [i][1]; //affectation 

        }
        std::cout << "\n";
    }

  return 0;
}

Messages postés
3840
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
11 juin 2021
121
Nouvelle question, nouveau sujet. Un fil de discussion par problème. Merci.