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 Statut Membre Dernière intervention 4 mai 2011 - 10 juin 2008 à 22:35
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre 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

6 réponses

cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
11 juin 2008 à 20:03
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;
}
3
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
11 juin 2008 à 19:48
Ce code utilise la librairie BOOST que tu dois installer. Voir site de "boost consulting".
0
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
11 juin 2008 à 19:54
Sinon, c'est pas ofstream, mais ifstream ( fichier en lecture ).
0
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011
18 juin 2008 à 11:23
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
                 
0

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

Posez votre question
cs_Lucky92 Messages postés 180 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 16 août 2012 2
18 juin 2008 à 12:20
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...
0
zebulon88 Messages postés 32 Date d'inscription jeudi 5 juin 2008 Statut Membre Dernière intervention 4 mai 2011
18 juin 2008 à 17:20
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
0
Rejoignez-nous