web-dev-qa-db-fra.com

Créer/écrire dans un nouveau fichier dans Qt

J'essaie d'écrire dans un fichier et si ce fichier n'existe pas, créez-le. J'ai cherché sur internet et rien n'a fonctionné pour moi.

Mon code ressemble actuellement à ceci:

QString filename="Data.txt";
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
    QTextStream stream( &file );
    stream << "something" << endl;
}

Si je crée un fichier texte appelé Data dans le répertoire, il reste vide. Si je ne crée rien, il ne crée pas non plus le fichier .. .. Je ne sais pas quoi faire avec cela, ce n'est pas la première fois que j'ai essayé de créer/écrire dans un fichier des façons travaillées.

Merci pour vos réponses.

44
Tom83B

Êtes-vous sûr que vous êtes dans le bon répertoire?
L’ouverture d’un fichier sans chemin complet l’ouvrira dans le répertoire de travail en cours. Dans la plupart des cas, ce n'est pas ce que vous voulez. Essayez de changer la première ligne en 

QString filename="c:\\Data.txt" ou
QString filename="c:/Data.txt"

et voir si le fichier est créé dans c:\

21
shoosh

C'est bizarre, tout va bien, êtes-vous sûr que cela ne fonctionne pas pour vous? Parce que cette main fonctionne sûrement pour moi, je chercherais donc ailleurs la source de votre problème.

#include <QFile>
#include <QTextStream>


int main()
{
    QString filename = "Data.txt";
    QFile file(filename);
    if (file.open(QIODevice::ReadWrite)) {
        QTextStream stream(&file);
        stream << "something" << endl;
    }
}

Le code que vous avez fourni est aussi presque le même que celui fourni dans description détaillée de QTextStream donc je suis presque sûr que le problème est ailleurs :)

Notez également que le fichier ne s'appelle pas Data mais Data.txt et doit être créé/situé dans le répertoire à partir duquel le programme a été exécuté (pas nécessairement celui où se trouve l'exécutable).

21
Palmik
#include <QFile>
#include <QCoreApplication>
#include <QTextStream>

int main(int argc, char *argv[])
{
    // Create a new file     
    QFile file("out.txt");
    file.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file);
    out << "This file is generated by Qt\n";

    // optional, as QFile destructor will already do it:
    file.close(); 

    //this would normally start the event loop, but is not needed for this
    //minimal example:
    //return app.exec();

    return 0;
}
8
d.danailov

Votre code convient parfaitement, vous ne cherchez simplement pas le bon emplacement pour trouver votre fichier. Comme vous n'avez pas fourni de chemin absolu, votre fichier sera créé par rapport au dossier de travail actuel (plus précisément dans le dossier de travail actuel de votre cas).

Votre dossier de travail actuel est défini par Qt Creator. Allez dans Projets >> Votre construction sélectionnée >> Appuyez sur le bouton "Exécuter" (à côté de "Construire) et vous verrez ce que c'est sur cette page que vous pouvez bien sûr également changer.

 enter image description here

3
zar

Il peut arriver que la cause ne soit pas que vous ne trouviez pas le bon répertoire. Par exemple, vous pouvez lire le fichier (même sans chemin absolu) mais il semble que vous ne pouvez pas y écrire.

Dans ce cas, il se peut que vous programmiez des sorties avant que l'écriture ne soit terminée.

Si votre programme utilise une boucle d'événement (comme avec une application graphique, par exemple QMainWindow), ce n'est pas un problème. Cependant, si votre programme se ferme immédiatement après l'écriture dans le fichier, vous devez vider le flux de texte, fermer le fichier ne suffit pas toujours (et c'est inutile, car il est fermé dans le destructeur).

stream << "something" << endl;
stream.flush();

Cela garantit que les modifications sont validées dans le fichier avant que le programme ne poursuive cette instruction. 

Le problème semble être que le fichier QFile est détruit avant le fichier QTextStream. Ainsi, même si le flux est vidé dans son constructeur, il est trop tard, car le fichier est déjà fermé.

0
vsz
QFile file("test.txt");
/*
 * If file not exit it will create
 * */
if (!file.open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::ReadWrite))
{
    qDebug() << "FAIL TO CREATE FILE / FILE NOT EXIT***";
}

/*for Reading line by line from text file*/
while (!file.atEnd()) {
    QByteArray line = file.readLine();
    qDebug() << "read output - " << line;
}

/*for writing line by line to text file */
if (file.open(QIODevice::ReadWrite))
{
    QTextStream stream(&file);
    stream << "1_XYZ"<<endl;
    stream << "2_XYZ"<<endl;
}
0
nilesh suryawanshi