String et stringstream [Résolu]

eupeup 57 Messages postés mardi 11 mars 2003Date d'inscription 24 avril 2013 Dernière intervention - 24 avril 2013 à 16:16 - Dernière réponse : eupeup 57 Messages postés mardi 11 mars 2003Date d'inscription 24 avril 2013 Dernière intervention
- 24 avril 2013 à 20:07
Hello,

j'ai une petite question au sujet d'une lecture de fichier.
Je parse mon fichier de la manière suivante (en gros)

std::ifstream fichier(_filePath.c_str(), std::ios::in);
while (!fichier.eof())
{
fichier >> tmp;
parsedFile.push_back(tmp);
tmp.clear();
}

Le fichier que je parse est un fichier plat avec 3 champs par ligne. Les deux premiers sont des string et le troisième est un double.
L'idée est de la injecter dans deux vecteurs de string et un vecteur de double pour le troisième élément.

std::stringstream flux;
double tmp;
for (std::vector <std::string>::iterator iter=parsedFile.begin()+5; iter!=parsedFile.end(); iter++) {

_firstFactorNames.push_back(*iter); iter++;
_secondFactorNames.push_back(*iter); iter++;
flux << *iter;
fluxx >> tmp;
_correlValues.push_back(tmp);
}

Ma question porte sur le cast en double via un stringstream... Est ce convenable comme j'ai fait ? je trouve l'écriture particulièrement lourde...
Qu'en pensez vous ?

Merci d'avance

Peupeu
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
cptpingu 3827 Messages postés dimanche 12 décembre 2004Date d'inscription 6 octobre 2018 Dernière intervention - 24 avril 2013 à 19:31
3
Merci
Bonjour.

Pense à utiliser les balises de code la prochaine fois, merci :)

J'écrirais simplement:

std::ifstream fichier(_filePath.c_str());
std::string arg1; // Trouver des noms de variables plus explcite :p
std::string arg2;
double arg3;
if (!fichier)
{
  std::cerr << "Can't read file: " << fichier << std::endl;
  return 1;
}

// Traiter ici les éventuelles header du fichier à lire

// Lecture des 3 champs, et ajout dans les tableaux.
while (fichier >> arg1 >> arg2 >> arg3)
{
  _firstFactorNames.push_back(arg1);
  _secondFactorNames.push_back(arg2);
  _correlValues.push_back(arg3);  
}


Quelques petits conseils:
- std::ios::in est inutile puisque tu as un std::ifstream (c'est un std::fstream en mode std::ios::in)
- iter++ => ++iter. Attention, dans le cas d'un "iterator" (c'est une classe), ++iter est bien plus rapide que iter++. En effet, ++iter incrémente "iter", mais iter++ copie "iter" l'incrémente de 1 puis le réassigne à "iter".
- La manière dont tu fais la conversion de string vers double est la bonne. L'écriture est un peu lourde, mais c'est bel et bien comme cela qu'il faut faire.
- iter!=parsedFile.end() => met parsedFile.end() dans une variable, sinon tu rappelles la fonction à chaque tour de boucle.

________________________________________________________________________
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

Merci cptpingu 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 99 internautes ce mois-ci

Commenter la réponse de cptpingu
eupeup 57 Messages postés mardi 11 mars 2003Date d'inscription 24 avril 2013 Dernière intervention - 24 avril 2013 à 20:07
0
Merci
Salut CptPingu,

désolé pour les balises
Ben je vais te dire merci, car tes explications sont très claires, et j'apprécie beaucoup les conseils tels que tu les as proposés... très pédagogique.

Ton implémentation est quand même bien plus "lisible" que la mienne, ca me plait bien :)

Merci et A+
Commenter la réponse de eupeup

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.