Découpage ligne et stockage dans un vecteur

Résolu/Fermé
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018 - Modifié le 18 sept. 2018 à 15:21
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 27 sept. 2018 à 15:11
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
A voir également:

31 réponses

cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
Modifié le 27 sept. 2018 à 10:36
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 25 sept. 2018 à 16:45
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);
}


0
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
27 sept. 2018 à 09:26
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 :)
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 sept. 2018 à 10:36
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.
0

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

Posez votre question
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
27 sept. 2018 à 10:49
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 :(
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 sept. 2018 à 10:59
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é).
0
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
27 sept. 2018 à 11:12
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 !
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié le 27 sept. 2018 à 11:24
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.

0
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
27 sept. 2018 à 11:34
d'accord !!! ça sera très difficile pour une débutante comme moi :)
0
cppcdb Messages postés 29 Date d'inscription mardi 18 septembre 2018 Statut Membre Dernière intervention 6 décembre 2018
27 sept. 2018 à 14:50
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;
}

0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
27 sept. 2018 à 15:11
Nouvelle question, nouveau sujet. Un fil de discussion par problème. Merci.
0
Rejoignez-nous