Seite 1 von 1

Problem mit QString und char*

Verfasst: 26. Februar 2009 21:40
von CodeMonkey
Hallo,

In einem Programm von mir wird ein QString aus einem Edit Fenster abgeholt und mittels

Code: Alles auswählen

char* text = line.toLocal8Bit().data();
in einen char* umgewandelt und char* Data[10000] abgespeichert. An anderer Stelle wird dieses char* Array dann wieder geladen und die einzelnen char* 's sollen wieder in QStrings umgewandelt werden, damit ich sie in ein QListWidget schieben kann. Das sieht dann so aus:

Code: Alles auswählen

for (int i=0; i<10000; i++)
{
    QString str(Data[i]);
    ui->list1->addItem(str);
}
Doch gerade an der Stelle, wo der QString initialisiert wird, kackt das Programm irgendwie ab, denn wenn ich ins Programm geh, ist es so, als ob die Strings nur Leerzeichen enthielten. Meiner Meinung wird aber alles korrekt abgespeichert...

Was hab ich falsch gemacht? Hab ich falsch umgewandelt oder falsch in die Liste geschoben oder den QString falsch implementiert?...

Es würde mich daher sehr freuen, wenn jemand die Zeit findet, sich mein Problem anzuschauen

PS: Ich hab versucht den Code so kurz wie möglich zu halten. Wenn's zu wenig Code ist, bitte sagen, dann poste ich mehr. Ich wollte euch halt nur nicht überschwemmen mit Code...

Verfasst: 26. Februar 2009 21:53
von CLRS530
Nimm besser toLatin1(). Ich weiß nicht ob es daran liegt, aber teste es eben. Desweiteren stell doch fest, wo die erwarteten Daten nicht vorliegen. Guck zuerst einmal, ob die Daten in dem text char richtig sind und geh dann systematisch weiter.

Verfasst: 26. Februar 2009 21:55
von solarix
Warum den rumpointern, wenn man nichts davon versteht :cry:

data() liefert bei dir den Pointer auf die internen Daten eines QByteArrays ("The pointer remains valid as long as the byte array isn't reallocated or destroyed.").... Quizfrage: wie lange lebt dieses QByteArray bei dir.....?
sollen wieder in QStrings umgewandelt werden, damit ich sie in ein QListWidget schieben
Warum nicht gleich in QStrings speichern?

[EDIT]
<Kommentar zu PointerArray gelöscht>

Verfasst: 27. Februar 2009 08:43
von RavenIV
solarix hat geschrieben: Warum nicht gleich in QStrings speichern?
Wollte ich auch grad fragen.
Verwendest Du das char-Array irgendwo auf sinnvolle Weise?
Oder warum machst Du diesen Umweg?

Verfasst: 27. Februar 2009 13:00
von CodeMonkey
toLatin1() ergibt leider keine Änderung, trotzdem Danke für den Tipp. Was den Speicher betrifft, funktioniert die Zeile

Code: Alles auswählen

QString str(Data[i]);
immer noch nicht und dank des Kommentars von Solarix, weiß ich jetzt wahrscheinlich auch wieso. Generell löst das mein Problem aber noch nicht.
Warum nicht gleich in QStrings speichern?
Nun, dass ist ein bisschen kompliziert: Zuerst hatte ich vor, dass so zu lösen. Ber ich brauche eine Lösung um viele Daten gleichzeitig abzuspeichern. Ich könnte natürlich für jeden String eine Datei machen, oder QStringlists benutzen. Wahrscheinlich liegts an mir, dass ich nich damit zurecht komme, wie QT Daten abspeichert oder wie QStringLists funktionieren, jedenfalls waren die Bugs und die Daten im Speicher zu der Zeit einfach nur seltsam.

Deshalb versuch ich das nun mit ofstream und ifstream. Gibt es einen Weg um damit QStrings zu speichern?

Und zu diesem Kommentar zu Pointer Arrays: Wenn es sich um konstruktive Kritik handelte, würd ich den gern lesen. Bin schließlich noch am lernen^^

Verfasst: 27. Februar 2009 13:15
von franzf
CodeMonkey hat geschrieben:Deshalb versuch ich das nun mit ofstream und ifstream. Gibt es einen Weg um damit QStrings zu speichern?
Du kannst dir selber operator<< und operator>> schreiben, um QString nach std::i/ofstream zu schreiben/lesen.
Aber prinzipiell bietet es sich an, wenn man eh schon Qt verwendet, auch QFile zum Dateihandling zu nehmen.

// edit:
Du weißt schon, dass QString auch Methoden "toStdString()" und "toStdWString()" hat? Mit std::string und std::wstring sollten iftream und oftream ja umgehen können.

Verfasst: 27. Februar 2009 13:49
von CodeMonkey
soweit ich weiß kommen die mit std::string nicht zurecht, aber ich werd das nochmal ausprobieren also danke für den Tipp

Verfasst: 27. Februar 2009 14:04
von franzf
CodeMonkey hat geschrieben:soweit ich weiß kommen die mit std::string nicht zurecht, aber ich werd das nochmal ausprobieren also danke für den Tipp

Code: Alles auswählen

#include <fstream>

int main()
{
    std::ofstream os("test.txt");
    std::string s("Hello, world");
    os << s;
    return 0;
}
funktioniert bei mir problemlos.
Aber wenn du nicht wirklich von den std::*fstreams abhängig bist (z.B. durch ne externe lib), würde ich dir QFile ans Herz legen. Da kannste direkt QString usw reinschrieben.

Verfasst: 27. Februar 2009 16:53
von solarix
Wenn man die STL nimmt, weil man sie nehmen _muss_ (z.B. wegen einer abhaengigen Library) verstehe ich das. Aber bitte nehmt nicht die STL, nur weil ihr Qt nicht versteht..... Ich gehe daher auf die STL-Vorschlaege nicht ein:

Wahrscheinlich liegts an mir, dass ich nich damit zurecht komme, wie QT Daten abspeichert oder wie QStringLists funktionieren, jedenfalls waren die Bugs und die Daten im Speicher zu der Zeit einfach nur seltsam.
ich wuerde sagen, dann loesen wir doch einfach _dieses_ Problem...

In der Doku (http://doc.trolltech.com/4.4/qstringlist.html#details) steht

Code: Alles auswählen

QStringList fonts;
fonts << "Arial" << "Helvetica" << "Times" << "Courier";
Weil schon fast Wochenende ist, ergaenze ich das mal um

Code: Alles auswählen

font.append("MyFont"); // noch ein weiterer Eintrag
foreach (QString nextFont, fonts)  // und alles ausgeben...
  qDebug() << nextFont;
Worin besteht nun noch das Problem?

Verfasst: 1. März 2009 16:21
von CodeMonkey
Sorry für die späte Antwort, der Stress im Leben zieht mal wieder große Geschütze auf...

Vielleicht hab ich mich was das speichern in QT angeht ein bisschen wage ausgedrückt: natürlich hab ich die Dokumentation gelesen und mir angeschaut, wie man QStringlists macht und wie QDatastreams funktionieren. Die Fehler fingen damit an, dass, als ich damit prüfen wollte ob eine Datei besteht

Code: Alles auswählen

if (!File.open(QIODevice::ReadOnly))
die if-Anweisung komischerweise nicht das tat, was sie tun sollte. Immer wenn eine Datei nicht existierte, wechselte das Programm in die else-verzweigung und immer wenn sie existierte, wurde die if-Anweisung ausgeführt...

Die Probleme gingen weiter mit Daten in den QStringlist - Objekten, die falsch abgespeichert wurden. Das war der Punkt, an dem ich 3 Möglichkeiten hatte:

1. Das casten von QString in den Griff kriegen und ifstream verwenden

2. QFile und QDatastream "richtig" benutzen

3. einen XML-Parser suchen und die Daten mit dem abspeichern

Die zweite Möglichkeit hab ich fast schon ausgeschlossen und mich mit dem XML Parser auseinanderzusetzen braucht Zeit. Ich entschied somit, dass wohl der schnellste Weg in der Lösung des Problems bei 1. lag.

Mittlerweile bin ich davon nicht mehr so überzeugt. Vielleicht könnt ihr mir ja in diese Richtung ratschläge geben...

Zum std::string: Das Casten hat geklappt und ich bin jetzt im Moment auf der Suche nach der geschicktesten Möglichkeit die std::strings wieder in QStrings umzuwandeln.

Edit: btw ich benutze QTCreator um mein Programm zu schreiben. Das ist aber noch eine Beta-Version. Könnten die Bugs damit zusammenhängen?

Verfasst: 1. März 2009 16:49
von franzf
CodeMonkey hat geschrieben:Die Fehler fingen damit an, dass, als ich damit prüfen wollte ob eine Datei besteht

Code: Alles auswählen

if (!File.open(QIODevice::ReadOnly))
die if-Anweisung komischerweise nicht das tat, was sie tun sollte. Immer wenn eine Datei nicht existierte, wechselte das Programm in die else-verzweigung und immer wenn sie existierte, wurde die if-Anweisung ausgeführt...
Passt doch alles. Du öffnest die Datei mit ReadOnly. Warum sollte die sich automatisch erstellen (das erwartest du doch, oder?). Da musst du schon selber Hand anlegen, z.B. mit QFile::exists() prüfen, ob die Datei existiert, und wenn nicht eine leere Datei erstellen.
Die Probleme gingen weiter mit Daten in den QStringlist - Objekten, die falsch abgespeichert wurden. Das war der Punkt, an dem ich 3 Möglichkeiten hatte:

1. Das casten von QString in den Griff kriegen und ifstream verwenden

2. QFile und QDatastream "richtig" benutzen

3. einen XML-Parser suchen und die Daten mit dem abspeichern
Sag doch was du machen willst. Was hat QString mit XML zu tun? Doch rein gar nichts! Und was bitte wurde falsch gespeichert? Die Umlaute oder was? Drück dich da mal bitte genauer aus.
Zum std::string: Das Casten hat geklappt und ich bin jetzt im Moment auf der Suche nach der geschicktesten Möglichkeit die std::strings wieder in QStrings umzuwandeln.
In dem du dich zu QString einfach mal im assistant umschaust, da gibt es soooo viele schöne Funktionen, bei denen überall auch Erklärungen dazu zu finden sind. Einfach mal [STRG+F] drücken und nach std::string suchen ist doch nicht soooo schwer, oder?
Edit: btw ich benutze QTCreator um mein Programm zu schreiben. Das ist aber noch eine Beta-Version. Könnten die Bugs damit zusammenhängen?
Definitiv denke ich nicht dass der Qt-Creator schuld ist.
Wenn du das denkst, mach die Dateien doch mal in nem anderen Editor auf und speicher sie wieder. Hält dich doch keiner ab, das mal auszuprobieren...

Verfasst: 1. März 2009 18:07
von CodeMonkey
@franzf: Es geht mir bei den 3 Möglichkeiten darum, wie ich meine Daten (in diesem Fall QStrings) am besten abgespeichert und wieder geladen krieg. Zum Speichern: Die Strings wurden immer 4 Mal abgespeichert und es wurden auch pro eintrag immer alle Strings abgespeichert, sodass am ende alles durcheinander war... aber ohne Quellcode bringt dir das wahrscheinlich nix. Ich muss das ganze nochmal angehen und mal schauen. Wenn ich dabei wieder Probleme bekomme kann ich ja nen gesonderten Thread anlegen, in dem ich mein Problem nochmal konkretisiere.

Das Speichern mit std::string haut wieder nicht hin und ich hab langsam auch keinen nerv mehr, rauszufinden welche umwandlung nicht funktioniert hat. Wie gesagt ich werde mich in den nächsten Tagen nochmal mit QFile auseinandersetzen
Definitiv denke ich nicht dass der Qt-Creator schuld ist.
Wenn du das denkst, mach die Dateien doch mal in nem anderen Editor auf und speicher sie wieder. Hält dich doch keiner ab, das mal auszuprobieren...
Gut, das beruhigt mich dann doch... man weiß ja heutzutage nicht mehr, was man von Beta (in manchem Fall auch von Release-) versionen halten darf. Ich dachte nur, dass ja unter Umständen irgendwelche Bugs bekannt sein könnten...

Edit: Problem ist nun gelöst: Ich habe alle QStrings in eine QList<QString> gepackt und speichere nunmehr mit QFile ab. Komischerweise funktioniert das viel besser als mit QStringLists...

Auf jeden Fall möchte ich mich bei euch für eure Zeit bedanken, die ihr in dieses Problem gesteckt habt. Ihr habt mir sehr weitergeholfen

Verfasst: 2. März 2009 12:16
von franzf
CodeMonkey hat geschrieben:Edit: Problem ist nun gelöst: Ich habe alle QStrings in eine QList<QString> gepackt und speichere nunmehr mit QFile ab. Komischerweise funktioniert das viel besser als mit QStringLists...
Was wirklich komisch ist...
Denn QStringList erbt von QList<QString>, wenn du mal in den Assistant schaust.
Ist denn der Code identisch, nur dass du statt QStringList jetzt QList<QString> verwendest? Dann würde mich der Codeabschnitt schon interessieren.

Verfasst: 2. März 2009 13:48
von CodeMonkey
Ist denn der Code identisch, nur dass du statt QStringList jetzt QList<QString> verwendest?
nicht ganz, vorher hab ich mit QStringlist den Operator << verwendet um Daten abzuspeichern. jetzt mit QList<QString> verwende ich .append. Das scheint wohl den Ausschlag gegeben zu haben...

beatwortet das deine Frage oder soll ich noch Code posten?