Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vérification d'un nom dans un fichier txt ??

    20 octobre 2017 à 16:22:28

    Bonjour,

    je travail actuellement avec QtCreator.

    Je suis novice et essaye de créer un répertoire de contacts pour réaliser des rapports d'interventions.

    J'en suis au stade ou j'arrive à écrire et lire un fichier ".txt" ligne par ligne dans un QlineWidget  avec QTextStream.

    L'écriture :

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include "lecturecontacts.h"
    #include "ui_lecturecontacts.h"
    #include "verificationdoublon.h"
    #include <QtCore>
    #include <QtGui>
    #include <QFile>
    #include <QTextStream>
    #include <QMessageBox>
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    
    void MainWindow::on_AddContactButton_clicked()
    {
        QString mNom = ui->nomContact->text();
        if (mNom.contains(QRegExp("^[A-Za-z]")))
        {
            QFile mNameFile("C:/Users/JustAin/Desktop/contacts.txt");
    
            if(!mNameFile.open(QIODevice::Append | QIODevice::Text))
            {
                QMessageBox::information(this,"","Impossible d'ouvrire le fichier pour écrire!");
                return;
            }
    
            QTextStream outContacts(&mNameFile);
            outContacts << ui->nomContact->text() << ";" <<ui->prenomContact->text() << "\n";
    
            mNameFile.flush();
            mNameFile.close();
    
    
        QString mNom = ui->nomContact->text();
    //_________________________________________________________________________
    /*    QFile mContactsFile("C:/Users/JustAin/Desktop/contacts.txt");
        QString contacts;
    
    
        if(!mContactsFile.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::information(this,"","Impossible d'ouvrire le fichier pour lire!");
            return;
        }
    
        QTextStream inContacts(&mContactsFile);
    
        while(!inContacts.atEnd())
        {
            QString mRepTempFile = inContacts.readAll();
            contacts += mRepTempFile;
            QString mot;
            mRepTempFile >> mot;
            QMessageBox::about(this,"esssais",mot);
        }
        mContactsFile.close();*/
    //__________________________________________________________________________________
    
            if (mNom.contains(QRegExp("^[A-Za-z]")) /*&& !contactExistant*/)
            {
                QFile mNameFile("C:/Users/JustAin/Desktop/contacts.txt");
    
                if(!mNameFile.open(QIODevice::Append | QIODevice::Text))
                {
                    QMessageBox::information(this,"","Impossible d'ouvrire le fichier pour écrire!");
                    return;
                }
    
                QTextStream outContacts(&mNameFile);
                outContacts << ui->nomContact->text() << ";" <<ui->prenomContact->text() << "\n";
    
                mNameFile.flush();
                mNameFile.close();
        }
        else
        {
            QMessageBox::information(this,"Information","Pas de nom inscrit");
        }
        }
    }
    void MainWindow::on_actionQuitter_triggered()
    {
        close();
    }




    La lecture dans la QlistWidget:

    #include "lecturecontacts.h"
    #include "ui_lecturecontacts.h"
    #include <QtCore>
    #include <QtGui>
    #include <QFile>
    #include <QTextStream>
    #include <QMessageBox>
    
    
    lectureContacts::lectureContacts(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::lectureContacts)
    {
        ui->setupUi(this);
    
        QFile mNameFile("C:/Users/JustAin/Desktop/contacts.txt");
        QString contacts;
    
        if(!mNameFile.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::information(this,"","Impossible d'ouvrire le fichier pour lire!");
            return;
        }
    
        QTextStream inContacts(&mNameFile);
    
    
        while(!inContacts.atEnd())
        {
            QString mRepertoire = inContacts.readLine();
            contacts += mRepertoire;
            ui->listWidget->addItem(mRepertoire);
        }
        mNameFile.close();
    }
    
    
    lectureContacts::~lectureContacts()
    {
        {
         delete ui;
        }
    }
    
    void lectureContacts::on_pushButtonActualisedRepertoire_clicked()
    {
        ui->listWidget->clear();
    
        QFile mNameFile("C:/Users/JustAin/Desktop/contacts.txt");
        QString contacts;
    
        if(!mNameFile.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::information(this,"","Impossible d'ouvrire le fichier pour lire!");
            return;
        }
    
        QTextStream inContacts(&mNameFile);
    
        while(!inContacts.atEnd())
        {
            QString mRepertoire = inContacts.readLine();
            contacts += mRepertoire;
            ui->listWidget->addItem(mRepertoire);
        }
    
        mNameFile.close();
    }
    



    Maintenant j'aimerais vérifier que le nom inscrit par l'utilisateur n'existe pas déjà afin de ne pas le rajouter.

    J'ai lu beaucoup de sujet sur les forum et essayé mais je bloque.

    Pourriez vous me venir en aide?:(

    Je vous en remercie.



    -
    Edité par AriB01 20 octobre 2017 à 16:34:04

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2017 à 19:51:38

      La partie écriture devrait être dans la même classe que la partie lecture. Changez le nom de la classe "lectureContacts" en "Contacts" et supprimer tout ce qui a trait à l'IHM. Ou séparez la classe "lectureContacts" en 2 classes, l'une qui ne fait que de l'affichage et une autre qui ne s'occupe que de fournir/maintenir une liste des contacts.

      Vous lisez le fichier ligne par ligne pour l'afficher, ligne 30 de votre 2ème code.

      En plus de l'ajouter à "contact" ligne 31 (mais je comprends pas pourquoi vous faites ça) et de remplir une Widget, ligne 32, pourquoi ne pas remplir un champ de type "std::vector<std::string>" ?

      Lors de la séparation en 2 classes, le remplissage de la Widget devrait être dans l'autre classe et utiliser la classe "Contacts" plutôt que de lire directement le fichier.

      >Maintenant j'aimerais vérifier que le nom inscrit par l'utilisateur n'existe pas déjà

      Comme l'objet qui sera utilisé pour sauvegarder les contacts sera le même que celui qui à servi à les charger. Dans la méthode de sauvegarde de la classe "Contacts", vous disposerez du champ rempli lors du chargement.

      Comme ce champs sera un "std::vector<std::string>", algorithme "find" vous indiquera si le nouveau nom existe déjà dans la liste des contacts.

      Ou même std::find_if, pour avoir une comparaison case insensitif:

      https://stackoverflow.com/questions/36494584/find-string-in-vector-of-strings-case-insensitive-c

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        20 octobre 2017 à 20:11:21

        Il devrait y avoir 2 parties séparées : une partie qui s'occupe de gérer le fichier pour alimenter les données (et retranscrire les nouveautés) et une partie qui se charge de l'affichage des données.

        Quand on ajoute une donnée, on appelle une fonction qui renverra true ou false (suivant que l'on ait réussi ou non à ajouter la donnée). Si une donnée est ajoutée, certaines fonctions seront appelées comme la mise à jour visuelle des données ou l'enregistrement de la nouvelle entrée dans le fichier.

        Concernant la mise à jour des fichiers, il faut faire attention parce que les accès disque peuvent être coûteux. Vaut-il mieux adopter une stratégie de réécriture à la fermeture de l'application ? Ajoute-t-on une ligne à la fin uniquement ? Les possibilités sont assez nombreuses. Cependant, la vue n'en a rien à faire de savoir comment faire. Elle dispose d'un modèle qu'elle se contente d'afficher.

        Cette séparation permettrait même de pouvoir récupérer des données facilement d'ailleurs (réseau par exemple).

        -
        Edité par anolya 20 octobre 2017 à 20:12:21

        • Partager sur Facebook
        • Partager sur Twitter
          21 octobre 2017 à 9:39:54

          Merci d'avoir pris du temps pour me lire et me répondre.

          bacelar:

          Pour la ligne 31 où j'ajoute mon string effectivement ça n'a aucun intérêt, cette ligne est resté après plusieurs essais.

          Je vais étudier vos propositions et très certainement revenir vers vous.

          NB: Pour être sûr! Le recoure à la création d'un fichier ".txt" est indispensable pour sauvegarder les contacts? Par là j'entends est ce que c'est comme ça que fonctionne les autres programmes (sans avoir la prétention de vouloir faire un programme niveau expert).

          Merci encore à vous.

          • Partager sur Facebook
          • Partager sur Twitter
            21 octobre 2017 à 14:07:07

            Pour que des données persistent à travers les différentes utilisations, l'utilisation de la mémoire morte ou du réseau est indispensable. Si on privilégie l'utilisation du réseau, il faudra alors vérifier qu'il n'y a pas d'infraction des règles en vigueur dans les différents pays sur le stockage de données.

            Le plus simple reste donc le stockage dans des fichiers.

            • Partager sur Facebook
            • Partager sur Twitter
              21 octobre 2017 à 23:36:42

              Typiquement, on va utiliser une base de données pour ce genre de choses, d'abord parce que ça scale mieux, une base de données est plus adaptée qu'un fichier pour gérer des gros volumes, ensuite parce que c'est plus adapté pour exploiter correctement les rapports d'intervention(*) et comme l'a dit anolya, il y a les contraintes légales, et notamment les règles en vigueur concernant les délais de conservation des données, avec un fichier ça va être compliqué, avec une base de données, il suffira d’exécuter périodiquement une requête, ce qui pourra être paramétré automatiquement au niveau du SGBD.

              (*) Je connais assez bien le sujet, suffisamment pour pouvoir dire que très souvent, la liste complète des rapports d'intervention n'a quasiment aucun intérêt. Ce qui est vraiment intéressant, c'est de pouvoir filtrer cette liste en fonction de critères, par exemple: nature de l'intervention, intervenant(s) , période, durée, actions entreprises... Ca, c'est typiquement le genre de choses qu'une base de données va permettre de faire relativement facilement

              -
              Edité par int21h 21 octobre 2017 à 23:39:58

              • Partager sur Facebook
              • Partager sur Twitter
              Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                15 novembre 2017 à 10:53:07

                Tout d'abord merci pour vos réponses.

                Cela m'a permis d'avancer car j'ai suivi le cours sur les bases de données et j'ai pu manipuler. Il est vrais que c'est beaucoup plus pratique.

                J'ai donc repris la programmation sur QT où j'ai pu donc me servir de la base m'y connecter y inscrire des données et les lires.

                Cependant (pour l'amélioration de la lecture du code et un gain de programmation) je voudrais y coder dans une classe à part et pouvoir l'utiliser dans ma QMainWindow et autres fenêtres qui seront créer par la suite.

                J'ai essayer mais ne comprend pas bien la démarche à suivre. Auriez vous un exemple?

                  Encore une fois étant novice je ne sais pas si c'est la bonne méthode.

                Merci par avance.

                -
                Edité par AriB01 15 novembre 2017 à 10:56:16

                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2017 à 11:49:13

                  > Encore une fois étant novice je ne sais pas si c'est la bonne méthode.

                  C'est une très très bonne initiative.

                  C'est de la modularisation.

                  Il faut que vous isoliez les fonctionnalités d'accès aux données du code métier, et que vous isoliez ce même code métier du code de l'IHM.

                  L'approche la plus simple, c'est de faire de chacune de ces couches logicielles une librairie, sauf la couche d'IHM qui sera une application.

                  L'application utilisera la bibliothèque métier.

                  La bibliothèque métier utilisera la bibliothèque d'accès aux données.

                  Le problème avec Qt, c'est qu'on a tendance à s'en servir partout donc à tous fusionner.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    22 novembre 2017 à 14:30:02


                    Si je comprend bien c'est cette architecture que je doit adopter?

                    Si oui aurais tu un exemple de code pour m'aider à me servir des données qui sont dans la BDD afin de les afficher dans les widgets de ma mainwindow? Ceci est un point bloquant pour moi.

                    Merci pour ton aide.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 novembre 2017 à 15:01:08

                      >Si je comprend bien c'est cette architecture que je doit adopter?

                      C'est moyen, mais on progresse. (IoC tout ça tout ça)

                      Qt semble disposer de pas mal d'outils de visualisation des données :

                      https://stackoverflow.com/questions/1701706/qt-equivalent-of-net-data-binding

                      Si des personnes peuvent donner de tutoriel sur le DataBinding en Qt, ça serait cool. :-°

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                      Vérification d'un nom dans un fichier txt ??

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown