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 ?
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
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 ?
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.
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.
Discord NaN. Mon site.
Discord NaN. Mon site.