Dateien und Ordner erstellen
Dateien und Ordner erstellen
Hallo,
mein Programm benötigt einige Ordner und Datei, in denen es konfigurationsdaten ablegt um dies beim nächsten Start wieder zu laden. Wenn ich nun das Programm das erste Mal starte, dann sind diese natürlich noch nicht vorhanden. Das Programm erstellt natürlich diese Ordner und Dateien, falls sie nicht vorhanden sind.
zb:
QFile f("artikler.config");
if(!f.exists())
{
if (f.open(QIODevice::ReadWrite | QIODevice::Text))
f.close();
}
QFile f2("combo.config");
if(!f2.exists())
{
if (f2.open(QIODevice::ReadWrite | QIODevice::Text))
f2.close();
}
QDir dir("workdir");
if(!dir.exists())
dir.mkdir(dir.absolutePath());
QDir dir2("database");
if(!dir2.exists())
dir2.mkdir(dir2.absolutePath());
das Erstellen funktioniert, nur stürzt das Programm nach dem ersten Start immer ab. Sind diese Dateien und Ordner vorhanden, so gibt es keine Probleme.
Wie kann ich diese Problem beheben bzw. finden!
mfg
acdc
mein Programm benötigt einige Ordner und Datei, in denen es konfigurationsdaten ablegt um dies beim nächsten Start wieder zu laden. Wenn ich nun das Programm das erste Mal starte, dann sind diese natürlich noch nicht vorhanden. Das Programm erstellt natürlich diese Ordner und Dateien, falls sie nicht vorhanden sind.
zb:
QFile f("artikler.config");
if(!f.exists())
{
if (f.open(QIODevice::ReadWrite | QIODevice::Text))
f.close();
}
QFile f2("combo.config");
if(!f2.exists())
{
if (f2.open(QIODevice::ReadWrite | QIODevice::Text))
f2.close();
}
QDir dir("workdir");
if(!dir.exists())
dir.mkdir(dir.absolutePath());
QDir dir2("database");
if(!dir2.exists())
dir2.mkdir(dir2.absolutePath());
das Erstellen funktioniert, nur stürzt das Programm nach dem ersten Start immer ab. Sind diese Dateien und Ordner vorhanden, so gibt es keine Probleme.
Wie kann ich diese Problem beheben bzw. finden!
mfg
acdc
An dem geposteten Code liegt es jedenfalls nicht, das Problem muss später in deinem Programm auftreten.
Vielleicht liest du an bestimmten Stellen die Datei/en ein, gehst aber davon aus, dass sie nicht leer sind?
Falls das der Fall ist, musst du bereits beim erstellen der Dateien irgendetwas reinschreiben, in die config Datei z.B. die Standardwerte
Vielleicht liest du an bestimmten Stellen die Datei/en ein, gehst aber davon aus, dass sie nicht leer sind?
Falls das der Fall ist, musst du bereits beim erstellen der Dateien irgendetwas reinschreiben, in die config Datei z.B. die Standardwerte
naja wenn sie leer sind, dann hab ich diese Möglichkeit schon abgefangen!
hab in der Dokumenation gelesen, dass
"
The QFile class provides an interface for reading from and writing to files. More...
#include <QFile>
Inherits QIODevice.
Inherited by QTemporaryFile.
Note: All functions in this class are reentrant, except for setEncodingFunction() and setDecodingFunction(), which are nonreentrant.
"
die Funktionen "reentrant" also ablaufinvariant sind. Kann das damit zutun haben?
hab in der Dokumenation gelesen, dass
"
The QFile class provides an interface for reading from and writing to files. More...
#include <QFile>
Inherits QIODevice.
Inherited by QTemporaryFile.
Note: All functions in this class are reentrant, except for setEncodingFunction() and setDecodingFunction(), which are nonreentrant.
"
die Funktionen "reentrant" also ablaufinvariant sind. Kann das damit zutun haben?
So weit ich weiß, ist reentrant nur wichtig, wenn du mehrere Threads benutzt. Außerdem habe ich vor kurzem selbst so ein Programm geschrieben, das erzeugen der Dateien etc. hat auch gut funktioniert und nachher gab es auch keine Probleme. Wenn du den Fall, wenn die Dateien leer sind, abfängst, weiß ich leider auch nicht, wo der Fehler liegt. Ansonsten vielleicht mal mit Debugger laufen lassen und gucken, wo der Fehler auftritt.
linuQs hat geschrieben:So weit ich weiß, ist reentrant nur wichtig, wenn du mehrere Threads benutzt. Außerdem habe ich vor kurzem selbst so ein Programm geschrieben, das erzeugen der Dateien etc. hat auch gut funktioniert und nachher gab es auch keine Probleme. Wenn du den Fall, wenn die Dateien leer sind, abfängst, weiß ich leider auch nicht, wo der Fehler liegt. Ansonsten vielleicht mal mit Debugger laufen lassen und gucken, wo der Fehler auftritt.
Kann ich in Netbeans auch QT debuggen, welches Programm beutze ch da?
-Hat jemand einen guten Vorschlag?
Ich lese es so, daß wenn die Datei offen ist ein ReadWrite Befehl gesetzt ist. Zu diesem Zeitpunkt ist die Datei aber noch nicht offen wie ich meine.
>> Datei.open(QIODevice::ReadWrite);
>>
>>
>> if(Datei.isOpen())
>> {
...........
und so weiter.
Achim
>> Datei.open(QIODevice::ReadWrite);
>>
>>
>> if(Datei.isOpen())
>> {
...........
und so weiter.
Achim
Man muß nicht jeden Blödsinn mitmachen, nur weil er neu ist.
ok, habe readwrite auf WriteOnly gesetzt.
mit dem Dbugger vom Qt Creater kommt beim Starten nun folgende Meldung:
Der Prozess wurde durch erhalt eines Signals vom Betriebsystem angehalten.
Name des Signals: SIGSEGV
Bedeutung: Segmentation fault
->(siese Zeile ist markiert worden)0 ZN7QObjectC2EPS_ C:\Qt\2010.01\qt\bin\QtCore4.dll 0 0x6a2c4c79
1 ?? 0 0x00402990
2 ?? 0 0x0058adb0
3 ?? 0 0xbaadf00d
4 ?? 0 0x0028fce8
5 ZN14QWidgetPrivate13createTLExtraEv C:\Qt\2010.01\qt\bin\QtGui4.dll 0 0x65144ad8
6 ?? 0 0x0040a340
7 ?? 0 0x0058adb0
8 ?? 0 0x0028fe28
9 ?? 0 0x0028fdec
10 ?? 0 0x0058a2e8
11 ?? 0 0x014a8d7e
12 ?? 0 0x00000000
im Disasambler wird diese Zeile markiert!
8: 0x6a2c4c79 mov 0x4(%ebx),%eax
Das ist für mich nicht sehr aussagekräftig
mit dem Dbugger vom Qt Creater kommt beim Starten nun folgende Meldung:
Der Prozess wurde durch erhalt eines Signals vom Betriebsystem angehalten.
Name des Signals: SIGSEGV
Bedeutung: Segmentation fault
->(siese Zeile ist markiert worden)0 ZN7QObjectC2EPS_ C:\Qt\2010.01\qt\bin\QtCore4.dll 0 0x6a2c4c79
1 ?? 0 0x00402990
2 ?? 0 0x0058adb0
3 ?? 0 0xbaadf00d
4 ?? 0 0x0028fce8
5 ZN14QWidgetPrivate13createTLExtraEv C:\Qt\2010.01\qt\bin\QtGui4.dll 0 0x65144ad8
6 ?? 0 0x0040a340
7 ?? 0 0x0058adb0
8 ?? 0 0x0028fe28
9 ?? 0 0x0028fdec
10 ?? 0 0x0058a2e8
11 ?? 0 0x014a8d7e
12 ?? 0 0x00000000
im Disasambler wird diese Zeile markiert!
8: 0x6a2c4c79 mov 0x4(%ebx),%eax
Das ist für mich nicht sehr aussagekräftig
Unter Linux kannst du einfach den gdb zum debuggen benutzen, mit Windows kenne ich mich da leider nicht aus.
Aber wenn du keinen Debugger hast / der nicht funktioniert, kannst du auch einfach an einigen Stellen im Code sowas wie
einbauen. Wenn du dann ungefähr weißt, wo der Fehler auftritt, an die Stelle noch mehr Zeilen einfügen. Das ist bei sehr viel Code natürlich umständlich, aber wenigstens findest du dann raus, wo der Fehler liegt
Aber wenn du keinen Debugger hast / der nicht funktioniert, kannst du auch einfach an einigen Stellen im Code sowas wie
Code: Alles auswählen
qDebug() << "Test 1";
...
qDebug() << "Test 2";
...
qDebug() << "Test 3";Also Folgendes:
hatte eine Idee.
int main(int argc, char *argv[])
{
init();
QApplication a(argc, argv);
a.addLibraryPath(a.applicationDirPath());
#ifdef Q_WS_WIN
//qInstallMsgHandler( debugOutput );
#endif
MainWindow w;
w.show();
return a.exec();
}
das qInstallMsgHandler( debugOutput ); lies ich weg und es funktionierte alles einwandfrei!
danke für Eure Vorschläge und ich hoffe es bleibt auch dabei, dass alles funktioniert!
hatte eine Idee.
int main(int argc, char *argv[])
{
init();
QApplication a(argc, argv);
a.addLibraryPath(a.applicationDirPath());
#ifdef Q_WS_WIN
//qInstallMsgHandler( debugOutput );
#endif
MainWindow w;
w.show();
return a.exec();
}
das qInstallMsgHandler( debugOutput ); lies ich weg und es funktionierte alles einwandfrei!
danke für Eure Vorschläge und ich hoffe es bleibt auch dabei, dass alles funktioniert!
AuE hat geschrieben:Poste mal den Code vom MessageHandler. Ich nutze das hier unter Unix (Debian x64>) auch - keine Probleme!
void debugOutput(QtMsgType type, const char *msg)
{
static QTextBrowser *browser= new QTextBrowser();
browser->setWindowTitle("Debug-Fenster");
browser->move(700,30);
browser->show();
switch(type)
{
case QtDebugMsg:
browser->append(QString("Debug: %1").arg(msg));
break;
case QtWarningMsg:
browser->append(QString("Warning: %1").arg(msg));
break;
case QtCriticalMsg:
browser->append(QString("Critical: %1").arg(msg));
break;
case QtFatalMsg:
browser->append(QString("Fatal: %1").arg(msg));
break;
}
}
Ich tippe mal auf deinen Textbrowser 
Code: Alles auswählen
void handleOutput(QtMsgType type, const char *msg)
{
switch (type)
{
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
QMessageBox::information(NULL, "Debug", QString(msg));
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
QMessageBox::information(NULL, "Warning", QString(msg));
break;
case QtCriticalMsg:
fprintf(stderr, "Critical: %s\n", msg);
QMessageBox::information(NULL, "Critical", QString(msg));
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
QMessageBox::information(NULL, "Fatal", QString(msg));
abort();
}
}
Hab nun einmal den Code getauscht und es scheint zu funktionieren - auf das wär ich wahrscheinlich nie gekommen.AuE hat geschrieben:Ich tippe mal auf deinen Textbrowser
Code: Alles auswählen
void handleOutput(QtMsgType type, const char *msg) { switch (type) { case QtDebugMsg: fprintf(stderr, "Debug: %s\n", msg); QMessageBox::information(NULL, "Debug", QString(msg)); break; case QtWarningMsg: fprintf(stderr, "Warning: %s\n", msg); QMessageBox::information(NULL, "Warning", QString(msg)); break; case QtCriticalMsg: fprintf(stderr, "Critical: %s\n", msg); QMessageBox::information(NULL, "Critical", QString(msg)); break; case QtFatalMsg: fprintf(stderr, "Fatal: %s\n", msg); QMessageBox::information(NULL, "Fatal", QString(msg)); abort(); } }
Warum tritt das Problem nun genau auf?
mfg acdc
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Da der QTextBrowser static ist, sollte das eigentlich nicht der Fall sein:Christian81 hat geschrieben:Naja - spätestens bei der zweiten Ausabe hat man zwei Textbrowser...
Code: Alles auswählen
static QTextBrowser *browser= new QTextBrowser();