Comment récupérer la deuxième colonne d'un fichier .txt en C++.NET [Résolu]

zebulon88
Messages postés
32
Date d'inscription
jeudi 5 juin 2008
Dernière intervention
4 mai 2011
- 10 juin 2008 à 22:35 - Dernière réponse : zebulon88
Messages postés
32
Date d'inscription
jeudi 5 juin 2008
Dernière intervention
4 mai 2011
- 18 juin 2008 à 17:20
Bonjour à tous,

Je n'arrive pas à récupérer la deuxième colonne (séparé par une tab de la première colonne) d'un fichier .txt en C++.NET et à la mettre dans un vecteur.
Je précise que je code en .NET avec Visual C++ 2008 Express ce qui complique beaucoup la chose...
Je peux récupérer la n ième ligne il faut mainteant que je prenne le deuxième terme de la ligne.

On peut utiliser Tokenizer mais je n'arrive pas à l'adapter en C++.NET
Je débute en C++..

j'ai trouvé cette méthode mais elle ne fonctionne pas en .NET :

<ol class= "olcode" id="code1"><li>#include <vector>
</li><li>#include <string>
</li><li>#include <fstream>
</li><li>#include
</li><li></li><li>using namespace std;
</li><li>using namespace boost;
</li><li></li><li>int main()
</li><li>{
</li><li>  vector<string> colonne;
</li><li>  string ligne;
</li><li>  ofstream fichier("truc.txt" );
</li><li></li><li>  while (getline (fichier, ligne))
</li><li>  {
</li><li>    typedef boost::tokenizerchar> > tokenizer;
</li><li>    boost::char_separator<char> sep("\t" );
</li><li></li><li>    // tokenisation de la ligne courante </li><li>    tokenizer tokens(ligne, sep);
</li><li></li><li>    // Recup des tokens via un token_iterator</li><li>    tokenizer::iterator tok_iter = tokens.begin();
</li><li>    if(tok_iter != tokens.end())
</li><li>    {
</li><li>      tok_iter++;
</li><li>      if(tok_iter != tokens.end()) colonne.push_back(*tok_iter);
</li><li>      elsethrow string("Fichier corrompu - 2e colonne manquante" );
</li><li>    }
</li><li>  }
</li><li></li><li>  return 0;
</li><li>}</li></ol>

Pourriez vous m'aider s'il vous plait?

Merci beaucoup
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Dernière intervention
16 août 2012
- 11 juin 2008 à 20:03
3
Merci
J'ai testé le code avec boost, il fonctionne bien. Mais, tu peux t'en passer :

#include <vector>
#include <string>
#include <sstream>
#include <fstream>
#include

int main()
{
    std::vector<std::string> colonne;
    std::string ligne;
    std::ifstream fichier("truc.txt" );
    std::string mot;

    while ( std::getline( fichier , ligne) )
    {
        std::istringstream iss( ligne );
        iss >> mot >> mot ;
        colonne.push_back( mot );
    }
    return 0;
}

Merci cs_Lucky92 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 95 internautes ce mois-ci

Commenter la réponse de cs_Lucky92
cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Dernière intervention
16 août 2012
- 11 juin 2008 à 19:48
0
Merci
Ce code utilise la librairie BOOST que tu dois installer. Voir site de "boost consulting".
Commenter la réponse de cs_Lucky92
cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Dernière intervention
16 août 2012
- 11 juin 2008 à 19:54
0
Merci
Sinon, c'est pas ofstream, mais ifstream ( fichier en lecture ).
Commenter la réponse de cs_Lucky92
zebulon88
Messages postés
32
Date d'inscription
jeudi 5 juin 2008
Dernière intervention
4 mai 2011
- 18 juin 2008 à 11:23
0
Merci
Bonjour Lucky92,

Ta solution à mon problème est d'une simplicité écoeurante...
Merci beaucoup. (j'étais absent les qq jours précdents)

Je ne sais pas pourquoi ca marchait pas avec boost j'avais bien mis les librairies.

En tout cas merci, j'étais parti sur un genre de solution :
avec des :
StreamReader^ srz = gcnew StreamReader("donnees_en_z.txt");
et des split(), array<String^>^splitz;
        array<String^>^splitk;
    System::Collections::IEnumerator^ myEnumz;

ce qui donne un truc du genre (qui marche pas) :
            while(srk->Peek() >= 0)              
            {   linek = srk->ReadLine();
                splitk = linek->Split(chars);
                myEnumk = splitk->GetEnumerator();
                if(cptligne==4)
                {    StreamReader^ srk = gcnew StreamReader("donnees_en_k.txt");
                    std::ofstream file1( "matrice_w.txt", std::ios_base::app );
                    cptligne=1;file1<<"\n";
                    }else{cptligne++;}
                while ( myEnumk->MoveNext())
                { 
etc..........

Peux tu m'expliquer l'utilité des streamReader en .NET, cela me semble bcp plus compliqué?

Zebul
                 
Commenter la réponse de zebulon88
cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Dernière intervention
16 août 2012
- 18 juin 2008 à 12:20
0
Merci
Bonjour,

Heureux que ça t'ait dépanné.

Désolé, je ne connais pas les "streamReader" : c'est du C++ managé,  un langage 100% Microsoft .NET, trés différent du c++ standard ; d'ailleurs, le mélange de technologies, std::ofstream et streamReader, a trés peu de chance d'aboutir !!!

Bonne continuation...
Commenter la réponse de cs_Lucky92
zebulon88
Messages postés
32
Date d'inscription
jeudi 5 juin 2008
Dernière intervention
4 mai 2011
- 18 juin 2008 à 17:20
0
Merci
Merci.
Sais tu s'il y a un moyen simple pour écrire au début d'un fichier?
J'ai des calculs à faire et le dernier résultat doit se trouver en premier.
(Je ne souhaite pas mettre ca dans un buffer mais l'écrire au fur a mesure)
je n'arrive pas avec seek

Merci de ton aide
Commenter la réponse de zebulon88

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.