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

Qt Discussion :

Lire un fichier à l'envers


Sujet :

Qt

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 3
    Points
    3
    Par défaut Lire un fichier à l'envers
    Vous allez surement me prendre pour un fou, mais voila mon problème :
    J'ai un fichier de 2 Mo constitué comme ceci :
    Ceci est le texte numéro 33454
    Dumque ibi diu moratur commeatus opperiens, quorum translationem ex Aquitania verni imbres solito crebriores prohibebant auctique torrentes, Herculanus advenit protector domesticus, Hermogenis ex magistro equitum filius, apud Constantinopolim, ut supra rettulimus, populari quondam turbela discerpti.
    -- http://monsite.com/33454.html
    %
    Ceci est le texte numéro 33412
    Itaque tum Scaevola cum in eam ipsam mentionem incidisset, exposuit nobis sermonem Laeli de amicitia habitum ab illo secum et cum altero genero, C. Fannio Marci filio, paucis diebus post mortem Africani. Eius disputationis sententias memoriae mandavi, quas hoc libro exposui arbitratu meo; quasi enim ipsos induxi loquentes, ne 'inquam' et 'inquit' saepius interponeretur, atque ut tamquam a praesentibus coram haberi sermo videretur.
    -- http://monsite.com/33412.html
    %
    Etc ...
    Donc en gros :

    -Texte
    -Lien contenant l'ID du texte
    -% (séparateur)

    En temps normal, mon programme, à l'aide du code ci-dessous, calcule le nombre de %, en choisit un au hasard et affiche le texte qui se trouve en dessous :

    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
     
    int count_nb_quotes = 0;
        QFile file("fortunes.txt");
     
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) 
        {
            QMessageBox::information(this, "Erreur", "Erreur à l'ouverture du fichier");
        } else {
     
            //On compte le nombre de quotes
            QTextStream in(&file);
            while (!in.atEnd())
            {
               QString line = in.readLine();
               if (line == "%")
               count_nb_quotes++;
            }
            file.reset();
            //Permet de remettre les flags du fichier à zéro, la lecture recommence au début.
     
            int ligneQuoteChoisie = nombreAleatoire(count_nb_quotes-1);
            QString mot;
            int count = 0;
     
            //On positionne le curseur au bon endroit
            QString osef;
            while (count < ligneQuoteChoisie)
            {
                osef = in.readLine();
                if (osef == "%")
                    count++;
            }
            QRegExp dtcExp ("^-- http://monsite.com/");
            QString lignelue;
            while (lignelue != "%")
            {
                lignelue = in.readLine();
                if ((lignelue != "%")&&(!lignelue.contains(dtcExp))) //Si la ligne ne contient ni l'URL ni le séparateur, on l'affiche
                    textEditQuote->append(htmlspecialchars(lignelue));
                if (lignelue.contains(dtcExp))
                {
                    uint taille = lignelue.length(); //Taille de l'ID (on enleve les 26 premiers caractères et les 5 ".html")
                    QString idQuote = lignelue.mid(26, taille -31); //On vire les 26 permiers caractères et les 5 de la fin
                    QString urlQuote = lignelue.mid(3, taille); //On vire les 3 premiers caractères
                    labelIDQuote->setText("<a href='" + urlQuote + "'>#" + idQuote + " (Voir les commentaires)</a>"); //On marque l'ID de la quote
                }
            }
            file.close();
        }
    }

    Donc je voudrais que lorsque l'utilisateur rentre un nombre (ex : 763) le programme cherche la ligne http://monsite.com/763.html, si elle n'existe pas, le lui signale (ça je sais faire) et enfin remonte le curseur jusqu'au % précédent et relise le fichier jusqu'au % d'après donc.

    Plus clair :

    ETAPE 0 : l'utilisateur rentre "763"

    texte
    -- http://monsite/812
    % ETAPE 2 : Il remonte à ce %
    texte ETAPE 3 : il lit ce texte
    -- http://monsite/763 ETAPE 1 : Le prog tombe la dessus
    %


    Donc là c'est surtout l'étape 2 qui me pose problème

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    tu veux rechercher le séparateur en partant de la fin de la chaine ?

    il suffit d'utiliser la fonction LastIndexOf() de la classe QString : http://qt.developpez.com/doc/4.5/qstring/#lastindexof

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je peux pas mettre tout mon fichier dans un string, il fait 2Mo.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Serialtueur Voir le message
    Je peux pas mettre tout mon fichier dans un string, il fait 2Mo.
    2Mo c'est rien du tout en mémoire.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Je veux bien tester, mais comment je devrais faire alors ? Mettre chaque ligne dans un array ? Mettre tout le fichier dans un seul string ?

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    On m'a proposé cette regex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            QRegExp rx(QString("\\n%\\n(.*)\\n-- http://monsite.com/%1.html").arg(43));
            rx.setMinimal(true);
            QString tonString = in.readAll();
            QString text;
            if (rx.indexIn(tonString) != -1)
                text = rx.cap(1);
            textEditQuote->append(text);
    Le souci c'est que la regex affiche bien le texte n°43, mais aussi des milliers au dessus, et ce qu'il y a au dessus varie à chaque fois...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 164
    Points : 161
    Points
    161
    Par défaut
    oui tu peux mettre tout le contenu du fichier dans un QString (2Mo c'est pas énorme), c'est bien ce que tu fais dans ton exemple de code avec la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QString tonString = in.readAll();
    n'est-ce pas ?

    en gros ça ressemblerait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     QString tonString = in.readAll();
    tonString = tonString.left(tonString.IndexOf("URL-avec-Nombre")); //ETAPE 1
    QString result = tonString.right(tonString.length() - tonString.LastIndexOf("%")); //ETAPES 2 et 3
    ce n'est peut être pas très optimisé je te l'accorde, mais à tester

Discussions similaires

  1. [AC-2010] Lire un fichier texte à l'envers
    Par Mut dans le forum VBA Access
    Réponses: 9
    Dernier message: 12/03/2013, 17h05
  2. [2.0] Lire un fichier wav à l'envers.
    Par SmokE dans le forum C#
    Réponses: 46
    Dernier message: 21/01/2008, 14h31
  3. Comment lire un fichier à l'envers ?
    Par spip68 dans le forum Langage
    Réponses: 15
    Dernier message: 13/12/2006, 01h24
  4. Lire un fichier de 50 gb
    Par Maryves dans le forum MFC
    Réponses: 2
    Dernier message: 08/01/2004, 15h08
  5. Lire le fichier du port série
    Par saibe dans le forum Linux
    Réponses: 7
    Dernier message: 09/04/2003, 10h29

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