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 :

Manipuler un texte: découpage en lignes, insertion aléatoire, etc.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut Manipuler un texte: découpage en lignes, insertion aléatoire, etc.
    Bonjour,

    Dans le cadre d'un projet personnel j'ai fait une interface GUI et donc je suis passé par les champs texte!

    Seulement on doit afficher ligne par ligne (forcément) donc c'est pratique de pouvoir accéder facilement aux différentes lignes. Puis l'utilisateur pourrait (dans certains cas) écrire au milieu du texte, ou alors par exemple dans le cas d'un client contenant un chat connecté à un serveur, les lignes les plus anciennes seraient effacées régulièrement (pour éviter de consommer trop de mémoire, on ne conserverait que les 1000 dernières lignes de chat).

    De plus on pourrait imaginer faire un éditeur de script (qui peuvent être très longs) avec cette interface


    Donc voilà je m'intéresse au différentes solutions qui permettraient de mettre ça en place.

    Pour l'instant j'ai la solution "naïve":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class MF_Texte
    {
    public/private:
        ...
     
        /* un vecteur pour donner les pos des lignes (début et fin) */
        std::vector<xy> poslignes;
        /* Le texte en lui-même */
        std::string texte;
    };
    Cette solution n'est pas vraiment bien parce qu'en cas d'insertion/suppression de caractères les std::string font des tonnes de recopiages.

    Donc je pensais faire à la place quelque chose du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MF_Texte
    {
    public/private:
        ...
     
        /* Le texte en lui-même -- découpé en différente lignes*/
        std::list<std::string> lignes;
        /* un vecteur pour accéder aux différentes lignes 
            Il contient des itérateurs de la liste lignes (enfin des références vers ces itérateurs */
        std::vector<std::list<string>::iterator *> accesseur;
     
    };
    Je trouve la solution assez satisfaisante même si en cas de décalage de ligne le vector se réécrit totalement...

    Mais bon, des tonnes d'applications utilisent une interface GUI, ça a dû être optimisé et donc j'aimerais savoir s'il existe de meilleures implémentations en C++ ou avoir des conseils (oui je suis un feignant je n'ai pas envie d'aller voir la source de WxWidgets tout de suite )

    Merci

  2. #2
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par coyotte507 Voir le message
    Cette solution n'est pas vraiment bien parce qu'en cas d'insertion/suppression de caractères les std::string font des tonnes de recopiages.
    Un seul std::string pour la totalité du text? Bien sur ça sera un peu lent quant on a un text de cent mille lignes.

    Il y a trop d'années, j'ai écrit un tel logiciel sur DOS, en Pascal. J'ai utilisé une liste liée, comme std::list, de string, où chaque string était une ligne du text.

    Alors, en C++, on peut faire une telle chose. Le text se trouve dans un std::list<std::string>. C'est très facile d'inserer une ligne entre deux autres, et ce n'est pas tres couteux d'inserer ou supprimer une caractère au milieu d'une ligne. Bien sur on verra des recopiages, mais ce seront petits. On ne garde qu'un std::list<std::string>::iterator pour la ligne actuelle, et un entier pour l'indexe du caractère actuel dans la ligne.

    Bonne chance!

  3. #3
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Ah oui effectivement, il n'y a peut-être pas besoin de garder en mémoire les positions de toutes les lignes.

    Du coup je pense que ça va marcher (en ayant un iterator pour la ligne de début d'affichage et un pour la ligne où y'a le curseur et les n° de lignes correspondants) , et ainsi le dernier problème a été résolu.


    Merci! (je reviendrais s'il y a des problèmes, mais je pense pas)

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

Discussions similaires

  1. [Bash] Insertion texte sous chaque ligne
    Par eZula dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/12/2007, 18h44
  2. Manipulation de texte, retour chariot et saut de ligne
    Par Jessica_ dans le forum VBA Word
    Réponses: 5
    Dernier message: 26/07/2007, 13h09
  3. [CR10 ]un texte sur plusieurs lignes?
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 28/09/2005, 07h26
  4. Réponses: 2
    Dernier message: 21/09/2005, 12h18
  5. Mode Texte 43/50 lignes
    Par M.Dlb dans le forum Assembleur
    Réponses: 24
    Dernier message: 19/10/2004, 00h24

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