Problem mit QIODevice

Alles rund um die Programmierung mit Qt
Antworten
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Problem mit QIODevice

Beitrag von Domar »

Hallo!

Ich hab da ein kleines Problem mit dem speichern von Files unter Qt...
aber erstmal der Code:

Code: Alles auswählen

QIODevice *file = KFilterDev::deviceForFile(path, KMimeType::findByFileContent(path)->name());
if(!file->open(QIODevice::WriteOnly))
{ //Hier geht er leider rein!
    if(!file)
    { //Hier nicht!
        return false;
    }
    return false;
}

QTextStream ts(file);
ts.setCodec("UTF-8");
ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
ts << doc->toString();
emit(written());
file->close();
return true;


Schluss mit lustig ist dann in der Zeile 2, weil bei file->open(QIODevice::WriteOnly) leider false raus kommt.

Kann mir bitte wer sagen, was daran Schuld sein könnte?
Ich kenn mich leider überhaupt nicht aus bei diesen Sachen.

mfg Domar
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Bist du sicher das du weißt, was du da machst?

Hast du dir die doku dazu schon einmal angesehen?

Code: Alles auswählen

     QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     QTextStream out(&file);
     out << "Test1" << "Test2" << "\n";
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Danke für deine schnelle Antwort!

Ich hab das mal so gemacht, wie du geschrieben hast.
Also eine QFile erstellt, diese dann überprüft und wieder returned er :-(

Welche Dokumentation meinst du? Ich hab leider noch keine gute gefunden!


mfg Domar
Exasperation
Beiträge: 186
Registriert: 11. März 2009 18:00
Wohnort: VS

Beitrag von Exasperation »

Domar hat geschrieben: Welche Dokumentation meinst du? Ich hab leider noch keine gute gefunden!
Naja wenn man von der Doku spricht meint man immer DIE Doku ;)

Hier steht eigentlich alles drin was man wissen muss. Offizielle Qt 4.5 Doku
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Poste nochmal deinen veränderten code und wir gehen das schritt für schritt durch. Je mehr code du postest, des besser kann man dir helfen!

Und die doku findest du hier!
archer
Beiträge: 306
Registriert: 2. Februar 2006 09:56

Beitrag von archer »

Liegt es vielleicht an irgendwelchen Benutzerrechten, das das IODevice nicht im Schreibmodus geöffnet werden kann?

Das if (!file) ist an der Stelle überflüssig. Es macht keinen Sinn erst auf file zuzugreifen und dann zu prüfen ob file überhaupt existiert.
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Danke, dass ihr mir so gut zur Seite steht!

Das if (!file) ist an der Stelle überflüssig. Es macht keinen Sinn erst auf file zuzugreifen und dann zu prüfen ob file überhaupt existiert.[/quote]
Dessen bin ich mir bewusst, das war vorher in einer if mit | verknüpft, ich habs aber zum debuggen auseinandergetrennt. Aber danke für die Erinnerung!

Code: Alles auswählen

QIODevice *file = KFilterDev::deviceForFile(path,"text/plain");
qDebug() << "nach QIODevice";
if(!file->open(QIODevice::WriteOnly))
{
    qDebug() << "file->open(...)" << file->errorString();
     return false;
}

QTextStream ts(file);
ts.setCodec("UTF-8");
ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
ts << doc->toString();
emit(written());
file->close();
return true;
Ich habs jetzt fasst! file->errorString() gibt mir "No such file or directory zurück"^^

Wie kann ich diese File nun zuerst mal erstellen?


mfg Domar
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Was machst du immer mit

Code: Alles auswählen

QIODevice *file = KFilterDev::deviceForFile(path,"text/plain"); 
???
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Mani99 hat geschrieben:Was machst du immer mit

Code: Alles auswählen

QIODevice *file = KFilterDev::deviceForFile(path,"text/plain"); 
???
Da das mit QFile auch nicht hingehaut hat, hab ich wieder zurückgewechselt. KFilterDev::deviceForFile(path,"text/plain") returned mir ja ein QIODevice, auf dem ich dann schreiben und lesen kann, oder?

Die Frage ist nur noch, warum die File nicht automatisch erstellt wird, wenn sich nicht vorhanden ist, bzw wie man sie erstellen kann.


lg Domar
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Hast du überhaupt schreibrechte, dort wo du das file erstellen willst?

Nimm wieder QFile anstelle des QIODevices von den KDE libs.
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

Ok, mach ich!

Schreibrechte sollte ich in meinem Home Verzeichnis auf alle Fälle haben, oder?

Wenn ich die File von Hand erstelle, schreibt mein Programm den gewünschten Text dort auch hinein, aber wenn die File nicht existiert, macht er gar nix...
Curtis Newton
Beiträge: 122
Registriert: 11. Juni 2008 18:39

Beitrag von Curtis Newton »

Domar hat geschrieben:Ok, mach ich!

Schreibrechte sollte ich in meinem Home Verzeichnis auf alle Fälle haben, oder?

Wenn ich die File von Hand erstelle, schreibt mein Programm den gewünschten Text dort auch hinein, aber wenn die File nicht existiert, macht er gar nix...
Ich kenne mich mit KFilterDevs nicht aus, aber "text/plain" sind ja eine Datei (plain) und ein Verzeichnis (text). Gibts es überhaupt dieses Verzeichnis? Oder was soll das sein?

C.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Also eigentlich müsste das file erstellt werden, poste doch mal deinen code!
Domar
Beiträge: 10
Registriert: 2. September 2009 09:32
Kontaktdaten:

Beitrag von Domar »

"text/plain" heißt, das der Inhalt der File Text ohne Formatierung ist.

Nochmal der Code:

Code: Alles auswählen

QFile file("/home/domar/domarstest.xml");

if(!file->open(QIODevice::WriteOnly))
{
        return false;
}

QTextStream ts(file);
ts.setCodec("UTF-8");
ts << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
ts << doc->toString();
emit(written());
file->close();
return true;
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Kompiliert dein source überhaupt? Ich kanns mir nicht vorstellen...

Code: Alles auswählen

QFile file("/home/domar/domarstest.xml");

if(!file->open(QIODevice::WriteOnly))
{
        return false;
}
Du greifst bei der if abfrage auf einen pointer namens "file" zu, welcher aber hier nicht erstellt wurde!
Antworten