Dateien und Ordner erstellen

Alles rund um die Programmierung mit Qt
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Dateien und Ordner erstellen

Beitrag von acdc »

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
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag von linuQs »

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
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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?
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag von linuQs »

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.
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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?
gon
Beiträge: 10
Registriert: 29. Januar 2010 20:29
Wohnort: Bremen

Beitrag von gon »

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
Man muß nicht jeden Blödsinn mitmachen, nur weil er neu ist.
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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
linuQs
Beiträge: 26
Registriert: 16. August 2009 11:28

Beitrag von linuQs »

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

Code: Alles auswählen

qDebug() << "Test 1";
...
qDebug() << "Test 2";
...
qDebug() << "Test 3";
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
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Poste mal den Code vom MessageHandler. Ich nutze das hier unter Unix (Debian x64>) auch - keine Probleme!
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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;
}
}
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

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();
	}
 }
acdc
Beiträge: 82
Registriert: 23. Oktober 2007 18:56

Beitrag von acdc »

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();
	}
 }
Hab nun einmal den Code getauscht und es scheint zu funktionieren - auf das wär ich wahrscheinlich nie gekommen.

Warum tritt das Problem nun genau auf?

mfg acdc
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Naja - spätestens bei der zweiten Ausabe hat man zwei Textbrowser...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
TSS
Beiträge: 73
Registriert: 24. November 2009 15:40
Kontaktdaten:

Beitrag von TSS »

Christian81 hat geschrieben:Naja - spätestens bei der zweiten Ausabe hat man zwei Textbrowser...
Da der QTextBrowser static ist, sollte das eigentlich nicht der Fall sein:

Code: Alles auswählen

static QTextBrowser *browser= new QTextBrowser(); 
Antworten