Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.0 - Qt Creator : 4.3.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Lire et écrire simplement dans un fichier texte

J'ai constaté qu'il y avait pas mal d'hésitations quand à la gestion du contenu d'un simple fichier texte.

Le mieux est de le transformer en QStringList à la lecture, une telle liste étant infiniment plus simple à analyser qu'un fichier

Je propose
QStringList list = listFromFile (nom du fichier);
list.at (0) correspondra à la 1ère ligne, list.at (1) à la 2ème, etc...
Le nombre de lignes lues sera donné par list.size ();

QStringList listFromFile (const QString &fileName)
{
QFile file (fileName); // nom du fichier

QStringList list;
if (not file.open (QIODevice::ReadOnly | QIODevice::Text)) {
// sendMessage (tr ("Impossible de lire le fichier %1").arg (fileName));
return list;
}
QTextStream in (&file);
in.setCodec ("UTF-8");

list = in.readAll ().split ('\n', QString::KeepEmptyParts);

return list;
}
ligne 13, QString::KeepEmptyParts permet de garder les lignes vides. Si elles ne vous intéressent pas, remplacez par QString::SkipEmptyParts

Pour l'écriture, on fait l'inverse. Le contenu de la liste de chaînes est converti en une QString qui est écrite dans le fichier.

void listToFile (const QString &fileName, const QStringList &list)
{
QFile file (fileName); // nom du fichier

if (not file.open (QIODevice::WriteOnly | QIODevice::Text)) {
// sendMessage (tr ("Impossible d'écrire dans le fichier %1").arg (fileName));
return;
}
QTextStream out (&file);
out.setCodec ("UTF-8");

out << list.join ("\n");
}
Note : les lignes commentées appelant sendMessage sont là pour prévenir l'appli ou l'utilisateur que ça s'est mal passé. Remplacez-les au choix par
- un emit ..
- un qDebug () << ...
- ou ce que vous voulez qui pourra vous convenir ;)

Réponses

  • Je vais finir par me faire une macro qui écrira "Merci PapaJaac !" ;)
    En attendant, je m'empare de :

    list = in.readAll ().split ('\n', QString::KeepEmptyParts)
    :)
  • Empare-toi de ce que tu veux, diffuse-le, améliore-le, simplifie-le, accélère-le, puis publie ta contribution : c'est le but de l'open-source. :)

    On trouve tout dans la doc et les exemples de Qt mais le problème est parfois qu'on est obligé de tout lire pour faire quelque chose de simple. Exemple : ma prochaine contribution sera d'exposer les bases de l'internationalisation d'un programme. Pour faire un truc de base, le lecteur s'appuie sur ma méthode et ça marche. Mais je n'y aborderai absolument pas les différentes options de QObjetc::tr(), parce que si le lecteur veut aller plus loin, il a la doc.
  • Dans le même esprit, je me permet de poster mes fonctions lecture / écriture de fichiers.
    Quelques petites différences minimes mais pouvant peut être servir.

    int MainWindow::listeVersFichier(const QStringList& lst, QString fichier)
    {
    QTextStream flux;
    QFile f;
    f.setFileName(fichier);

    if(!f.open(QIODevice::WriteOnly | QIODevice::Text))
    {
    QMessageBox::critical(this,"Erreur","Impossible d'ouvrir le fichier" + fichier);
    return 0;
    }
    flux.setDevice(&f);

    for(int i=0; i<lst.length(); i++)
    {
    flux<<lst.at(i)<<"\n";
    }

    f.close();
    return 1;
    }

    int MainWindow::fichierVersListe(QStringList &lst, QString fichier)
    {
    QTextStream flux;
    QFile f;

    f.setFileName(fichier);
    if(! f.open(QIODevice::ReadOnly | QIODevice::Text))
    {
    QMessageBox::critical(this,"Erreur","impossible d'ouvrir le fichier " + fichier);
    return 0;
    }

    flux.setDevice(&f);
    lst.clear();

    while(!flux.atEnd())
    {
    lst.append(flux.readLine());
    }
    f.close();
    return 1;
    }
Connectez-vous ou Inscrivez-vous pour répondre.