IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Extraire une chaine de caractères d'une autre chaine plus longue


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut Extraire une chaine de caractères d'une autre chaine plus longue
    Salut.

    J'ai un fichier qui se présente sous cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    algocaltop;algocaltopbis
    find;findbis
    test.html;test1.html
    Je veux en extraire à chaque ligne les 2 mots , le point virgule me sert de séparateur.

    Voici un extrait du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Text = QFileDialog::getOpenFileName(this, "Ouvrir la liste ", QString());
        QFile fichier (Text);
        fichier.open(QIODevice::ReadOnly | QIODevice::Text);
        QTextStream flux (&fichier);
        QString CurrentDir = QFileDialog::getExistingDirectory(this, "selectionner le repertoire de fichier à  modifier", QString());
        while( !flux.atEnd() )
     
        {
            QString fichier1;
            fichier1 = flux.readLine();
            QMessageBox::information(0,QObject::tr("debug"),
                                     "debug "+fichier1);
     
     
            int i= 1;
           const  char*  maChaine = fichier1.toStdString().c_str();
           QMessageBox::information(0,QObject::tr("debug"),
                                   maChaine);
           QString filename="";
           QString filename1="";
           QString test = "";
           QMessageBox::information(0,QObject::tr("debug"),
                                 filename);
     
            while (maChaine[i] != ';')
            {
                i=i+1;
               // QMessageBox::information(0,QObject::tr("debug"),maChaine[i]);
     
                if (maChaine[i] == ';' )
                {
                    test = maChaine[i];
                QMessageBox::information(0,QObject::tr("debug"),test);
                    break;
                 }
                filename += maChaine[i];
     
     
     
     
            }
     
    //        QMessageBox::information(0,QObject::tr("debug"),
    //                                 "debug "+ CurrentDir+"/"+filename);
                  i=i-1;
     
            while (maChaine[i] != '\0')
            {
                i=i+1;
               // QMessageBox::information(0,QObject::tr("debug"),maChaine[i]);
     
                if (maChaine[i] == '\0' )
                {
                    test = maChaine[i];
                QMessageBox::information(0,QObject::tr("debug"),test+filename1);
                    break;
                 }
                filename1 += maChaine[i];
            }
    J'ouvre le fichier, je le stocke ensuite dans un const char* et je le parcours à l'aide de 2 boucles, la première s'arrète pour "maChaine=';'" , je continue avec le même incrément pour la seconde et cette fois je m'arrête pour "maChaine = symbole fin de ligne"
    Le programme s' arrète bien ou je veux mais les 2 chaines que je récupére me donnent des symboles complètement aléatoires pouvant même parfois contenir les chemins de fichiers de mon disque !!

    Après quelques recherche sur le net je crois comprendre qu'il s'agit d'un problème de tampon, mais je n'en sait pas plus.

    J'utilise qt mais c'est je pense un problème de c++.

    Merci d'avance.

  2. #2
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    J'ai regardé vite fait la doc de QT, et j'ai trouvé que l'on peut ajouter un QTextCodec qui devrait répondre a ton besoin.ici

    Par contre, je n'ai jamais essayé de l'implémenter.

    sinon, j'ai déjà fait ce genre d'opération, mais j'avais utilisé la STL.

    Si tu veux plus d'info, j'essayerais de te donner un exemple!

    [edit]
    En regardant un peu plus ton code, il y a une chose qui me gene:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    filename += maChaine[i];
    J'aurais plutôt copié la chaine dans un autre char pour l'affecter en un seul coup par la suite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PremChaine[i] = machaine[i];
    //puis en dehors de la boucle
    filename = PremChaine;

  3. #3
    Membre éprouvé
    Avatar de mitkl
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2010
    Messages : 364
    Points : 1 081
    Points
    1 081
    Par défaut
    Bonjour,

    tu peux faire bien plus simplement en utilisant QString::split().
    Si vous ne savez toujours pas ce qu’est la récursivité, relisez cette phrase.

    Mon blog sur la programmation et l'informatique !

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Merci pour l'aide.

    Sous quel type doit être la variabe PremChaine?J'ai testé char ,Qchar et const char et il m'affiche toujours des erreurs de compilation pour cette ligne.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    tu peux faire bien plus simplement en utilisant QString::split().
    J'avais un turc équivalent au départ mais j'avais besoin que SEUL les points virgules soit considérés comme séparateurs. En effet un mot peut même contenir des espaces

  6. #6
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    PremChaine serait de la forme char*.
    avec XXX qui peut etre de la taille de la ligne en cours.
    ou plus dangereux: char PremChaine[512]...

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Décidement bien étrange, j'ai utilisé un QString pour la variable PremChaine[i] J'ai aussi rajouter la methode secodec à mon flux , mais n'y fait.

    J'ai toujours ces affreux symboles.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Idem avec char * ou char[512]

  9. #9
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    est ce qu'en debug, en pas a pas, tes chaines se comporte toute correctement?

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 59
    Points : 39
    Points
    39
    Par défaut
    Finalement c'est résolu grâce à :
    tu peux faire bien plus simplement en utilisant QString::split().
    J' avais mal lu la doc concernant cette méthode elle permet bien d'isoler n'importe quel élément de la chaine en gardant les autres dans une même chaine, même les espaces.

    Mais je comprends toujours pas pourquoi l'autre ne fonctionne pas.
    J'ai effectivement regardé les variables pas à pas et il me renvois des symboles aléatoires alors que je vérifie bien la chaine en entrant .
    D'ailleurs il me renvois plus de symboles qu'il n' y a de caractères dans ma chaine de départ.

    Heuresement grâce à vous je m'en sort quant même, merci

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Tu t'en sortirais sans doute mieux avec des regexp, mais il y a un coût d'apprentissage.
    Find me on github

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/01/2008, 17h58
  2. Réponses: 1
    Dernier message: 06/08/2007, 03h23
  3. JSP : comment remplacer une chaine de caractères par une autre
    Par techquos dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 14/12/2006, 09h37
  4. Fonction qui transforme chaine de caractère par une autre?
    Par geoffreykill dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 09/12/2004, 14h31
  5. [String]Recherche d'une chaine de caractères dans une autre
    Par Crazyblinkgirl dans le forum Langage
    Réponses: 3
    Dernier message: 29/07/2004, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo