Partage
  • Partager sur Facebook
  • Partager sur Twitter

Lecture de fichier avec Qt

    7 janvier 2023 à 14:11:47

    Bonjour,

    Je souhaite lire des fichier .txt avec Qt.

    Ces fichiers contiennent des groupes de données organisées comme suit :

    chaine de caractère

    5 int espacés

    10 int espacés

    18 int espacés

    et on recommence à la ligne avec d'autres valeurs.

    Mon programme doit lire les fichier et garder dans un tableau dynamique les chaines de caractères dont les int ont la bonne valeur.

    Je manipule mes fichier avec QFile et je les lis avec QTextStream.

    Ce qui me pose problème, c'est que ce dernier ne semble pouvoir sortir du fichier que des QString, bien que la doc dise qu'il peut aussi lire des int. Pourtant, aucune de ses méthodes n'a l'air de retourner un nombre (int, double ou autre).

    J'ai donc besoin de votre avis : quelle est la méthode la plus efficace pour lire mes int ?

    Est-ce que je stocke la ligne entière dans un tableau de QString que je convertis et coupe ensuite ?

    est-ce que je lis mot par mot avec une boucle for pour chaque ligne puis conversion à nouveau ?

    ou y a-t-il un moyen plus simple ?

    • Partager sur Facebook
    • Partager sur Twitter
      7 janvier 2023 à 14:20:36

      Pour lire un entier, il faut juste utiliser >>.

      int value;
      textStream >> value;

      Ca ne marche pas avec ca ?

      • Partager sur Facebook
      • Partager sur Twitter
        7 janvier 2023 à 16:01:31

        Bonjour gbdivers,

        J'aimerais bien te répondre mais à vrai dire mon fichier refuse de s'ouvrir et je ne comprends pas pourquoi...

        QList <QString> recherche_par_type(int x, int y, int z){
            QString ingredient;
            int i, j;
            int type[nombreType];
            QList <QString> listeIngredients;
        
            QFile *file = new QFile("Ingredients organises.txt");
            QTextStream lecture(file);
            if (file->open(QIODevice::ReadOnly | QIODevice::Text)){
                std::cout << "ouvert" << std::endl;
                for (i=0; i<nombreIngredients; i++){
                    ingredient = lecture.readLine();
                    lecture.readLine();
                    lecture.readLine();
                    for (j=0; j<nombreType; j++){
                        lecture >> type[j];
                    }
                    if (type[x]!=0 || type[y]!=0 || type[z]!=0){
                        listeIngredients.append(ingredient);
                    }
                }
            }
            else{
                std::cout << "pas ouvert" << std::endl;
            }
            return listeIngredients;
        }

        J'ai bien vérifié l'emplacement de mon fichier (qui est dans le même dossier que mon main.cpp) et son orthographe (pas de fautes)

        mais j'ai toujours le "pas ouvert" de mon else qui s'affiche. J'ai aussi essayé en mettant mon QTextStream après le if, sans résultat.

        • Partager sur Facebook
        • Partager sur Twitter
          7 janvier 2023 à 16:57:11

          Aëgis a écrit:

          (qui est dans le même dossier que mon main.cpp)

          Probleme classique, le chemin n'est pas correct. Le dossier courant est celui de l'executable, pas du code source.

          Et ton code pose plusieurs problemes :

          • ne predeclare pas tes variables en debut de fonction
          • n'utilise pas new pour QFile
          • c'est quoi "nombreIngrediant". Si c'est une variable globale, c'est bof
          • pourquoi "nombreType" est une constante, alors que tu as un nombre de valeurs different pour chaque ligne du fichier
          • Partager sur Facebook
          • Partager sur Twitter
            7 janvier 2023 à 20:47:06

            Je n'avais même pas remarqué que l'exécutable ne se créait pas dans le même dossier que le fichier source mais en amont (est-ce normal ?). J'ai donc mis mon .txt avec l'exécutable.

            J'ai également pris en compte tes remarques :

            • Je ne déclare mes variables que si la condition du if est réalisée (sauf la QList que le compilateur veux garder en dehors du if car sinon la fonction ne peut pas la retourner
            • QFile file("Ingredients organises.txt") --> je n'utilise plus de new
            • nombreIngredient est en effet une variable globale qui vaut 35, ce qui correspond à mon nombre de groupe de données, c'est-à-dire le nombre de groupe de 4 lignes présentés dans le premier post
            • nombreType est aussi une variable globale qui vaut 18, et j'ai deux autres variables globales qui valent 5 et 10.

            Pour l'instant, je me concentre que sur la ligne la plus longue car elle me permet de faire un premier tri dans mes groupes de données. Les deux autres lignes interviendront après, si tant est que cette fonction marche.

            Malgré ces corrections, mon fichier ne s'ouvre toujours pas

            EDIT : En cherchant un peu dans les paramètres de Qt Creator j'ai pu changé l'endroit où est créé l'exécutable. Il est maintenant au même endroit que le fichier source et je peux lire mon .txt

            J'en reviens à mon problème d'origine. Pour une raison qui m'échappe, que je lise mon fichier avec readLine() ou avec >>, Qt semble voir une ligne vide, ou compter un retour à la ligne comme une chaîne de caractère (une seule fois), si bien que la lecture du reste du fichier est compromise (les lignes se retrouvent dans les mauvaises variables). Pourtant il n'y a rien de tel dans mon .txt

            -
            Edité par Aëgis 8 janvier 2023 à 14:01:37

            • Partager sur Facebook
            • Partager sur Twitter
              17 janvier 2023 à 20:40:32

              Bonjour,

              Voici ma fonction :

              QList <QString> recherche_par_type(int x, int y, int z){
              
                  QList <QString> listeIngredients;
                  QFile file("Ingredients_organises.txt");
              
                  if (file.open(QIODevice::ReadOnly | QIODevice::Text)){
                      QTextStream lecture(&file);
              
                      QString ingredient, a, b;
                      int type[nombreType];
              
                      std::cout << "ouvert" << std::endl;
                      for (int i = 0; i<nombreIngredients; i++){
                          std::cout << "test" << std::endl;
                          //lecture >> ingredient;
                          ingredient = lecture.readLine();        //on lit l'ingredient
                          std::cout << "ingredient = " << ingredient.toStdString() << std::endl;
                          a = lecture.readLine();                 //on saute les deux lignes qui suivent
                          std::cout << "ligne a = " << a.toStdString() << std::endl;
                          b = lecture.readLine();
                          std::cout << "ligne b = " << b.toStdString() << std::endl;
                          for (int j = 0; j<nombreType; j++){ //on stocke une à une les valeurs de la dernière ligne dans un tableau
                              lecture >> type[j];
                              std::cout << type[j] << " ";
                          }
                          std::cout << std::endl;
                          if (type[x]!=0 || type[y]!=0 || type[z]!=0){ // si l'indice d'une valeur non nulle correspond à un des argument, on garde l'ingrédient en mémoire
                              std::cout << ingredient.toStdString() << std::endl;
                              listeIngredients.append(ingredient);
                          }
                          //lecture >> a;
                      }
                  }
                  else{
                      std::cout << "pas ouvert" << std::endl;
                  }
                  return listeIngredients;
              }

              Voici à quoi ressemble mon fichier :


              et voici ce que me sort la fonction quand je teste mon programme :

              Comme vous le voyez, la première boucle s'exécute sans encombre mais à partir de la deuxième ma variable ingredient est vide. Ce qui me surprend c'est que ce décalage n'augmente pas au fil des itérations. Une idée de ce qui peut se passer ?

              • Partager sur Facebook
              • Partager sur Twitter
                28 janvier 2023 à 9:03:51

                Vraiment personne ?

                J'ai fait plein de test, et à part déplacer le moment où se fait le décalage, ça n'a pas servi à grand chose.

                • Partager sur Facebook
                • Partager sur Twitter

                Lecture de fichier avec Qt

                × 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