Erfolgreiches Kompilieren ->Laufzeitfehler...

Alles rund um die Programmierung mit Qt
Antworten
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Werte Qt-Gemeinde,

ich bastle gerade an einem Tool, dass mir eine Texdatei in XML umwandelt.
Die einzelnen Values sind per "//" getrennt. Also versuchte ich eine Datei zu öffnen,
diese zeilenweise mit Split in eine Stringlist zu schreiben und dann über den Index zusammen mit XML-Tags in eine neue Datei zu schreiben. Kompilieren lässt es sich ohne Murren. Lade ich nun aber das zu konvertierende Dokument, so stürzt das Programm ab (Mac OSX 10.7.2).

Nachricht " CSV2XML <-(Name des Programms) wurde unerwartet beendet"

Die zu ladende Datei hat folgende Format

Anrede//Name//Art//Strasse//Ort

manche Elemente können auch leer sein, das wäre dann:

Anrede//Name////Strasse//Ort

insgesamt sind es immer 4 Trenner "//"

Hier ist mein Ansatz:

Header: hauptfenster.h

Code: Alles auswählen

#ifndef HAUPTFENSTER_H
#define HAUPTFENSTER_H

#include <QMainWindow>

namespace Ui {
class Hauptfenster;
}

class Hauptfenster : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit Hauptfenster(QWidget *parent = 0);
    ~Hauptfenster();
    
private:
    Ui::Hauptfenster *ui;

 public slots:
    void readFile();
    

};

#endif // HAUPTFENSTER_H

Quelldateien:
hauptfenster.cpp:

Code: Alles auswählen

#include "hauptfenster.h"
#include "ui_hauptfenster.h"
#include <QFile>
#include <QString>
#include <QFileDialog>
#include <QTextStream>
#include <QStringList>

Hauptfenster::Hauptfenster(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Hauptfenster)
{
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(readFile()));
}

Hauptfenster::~Hauptfenster()
{
    delete ui;
}

void Hauptfenster::readFile()
{

    //Ursprungsdatei wird durch einen QFileDialog geöffnet
    QFile file (QFileDialog::getOpenFileName(this,"Textdatei öffnen", "/", "Textdateien (*.*)"));
    file.open(QIODevice::ReadOnly | QIODevice::Text); // Als Text-Datei nur zum Lesen öffnen


    //Die zu schreibende Datei wird angelegt
    QFile file_save("test.xml");
    file_save.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&file_save);
    out <<"<?xml version=''1.0'' encoding=''UTF-8'' ?>"<<"\n";
    out <<"<adressen>"<<"\n";

    //Die Ursprungsdatei wird zeilenweise verarbeitet. Die Zeile wird an "//" gesplittet und die Werte wandern in eine
    //StringList.
    //Die Elemente der jeweiligen Zeile werden über einen Index aus der Stringlist ausgelesen und zwischen XML Tags eingefügt.
    QTextStream in(&file);
    while (!in.atEnd()) {
        QString line = in.readLine();
        QStringList felder = line.split("//");
        out <<"<datensatz>\n";
        out <<"<anrede>" << felder.at(0).constData() <<  "</anrede>"<<"\n";
        out <<"<name>" << felder.at(1).constData() <<  "</name>"<<"\n";
        out <<"<art>" << felder.at(2).constData() <<  "</art>"<<"\n";
        out <<"<strasse>" << felder.at(3).constData() <<  "</strasse>"<<"\n";
        out <<"<ort>" << felder.at(4).constData() <<  "</ort>"<<"\n";
        out <<"</datensatz>\n";

    }
    out <<"</adressen>"<<"\n";
    file_save.close();

    //Zur Übersicht werden die Daten der Quelldatei in einer texEdit angezeigt.
    ui->textEdit->setText(file.readAll());
    file.close();

    //Die generierte XML-Datei wird in einer zweiten textEdit angezeigt
    QFile file_load("test.xml");
    file_load.open(QIODevice::ReadOnly | QIODevice::Text);
    ui->textEdit_2->setText(file_load.readAll());
    file_load.close();

}


main.cpp:

Code: Alles auswählen

#include <QtGui/QApplication>
#include "hauptfenster.h"


int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Hauptfenster w;

    w.show();
    return a.exec();

}


Hat jemand eine Idee? Das Programm kompiliert wie gesagt ohne Probleme...
Grüße und gute Nacht
Timo
Gruß und vielen Dank -Timo-
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von Christian81 »

Wie immer - für so etwas gibt es einen Debugger.
Also Programm kompilieren, im Debugger laufe lassen und schauen wo genau es crasht.

Und ein paar Überprüfungen sollte man schon einbauen - z.B. ob die Dateien korrekt geöffnet werden konnten oder ob das split() wirklich 5 Elemente zurückgibt usw.
Nur weil ein Programm kompiliert heißt es nicht dass es auch läuft...
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Guten Morgen,

danke für den Tipp. Wenn ich den Debugger starte, dann bringt er mir nen Disassembler mit Assemblercode, den ich nicht wirklich
verstehe...Muss ich irgendetwas beachten?
Sobald ich die korrekte Fehlermeldung gefunden habe, werde ich sie posten.


Grüße
Timo
Gruß und vielen Dank -Timo-
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Der Debugger meldet:


"Der Prozess wurde nach Erhalt eines Signals vom Betriebssystem angehalten."

Name des Signals: EXC_BAD_ACCESS
Bedeutung Could not access memory
0x1000002a82 <+0x035e> mov 0x10(%rax),%r13

Aber welche Zeile Probleme macht, könnt ich bislang noch nicht herausfinden...
Gruß und vielen Dank -Timo-
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von franzf »

Christian hat doch ein paar konkrete Tips gegeben, einer davon würde wunderbar zur Meldung passen.
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Hallo,

erstmal vielen Dank für die nützlichen Tipps. Ich hab nun mit file.exists() und file.open()
herausgefunden dass beide Dateien schonmals geöffnet sind und deshalb nicht nochmals geöffnet werden könne

QFile::open: File (/Users/schweito/Documents/adressentxt.txt) already open
Die Quelldatei "/Users/schweito/Documents/adressentxt.txt" konnte nicht geöffnet werden.
QFile::open: File (test.xml) already open
Die Zieldatei "test.xml" konnte nicht geöffnet werden.

Nun ist meine Frage, wie das sein kann? In meinem Code habe ich doch beide nur einmal geöffnet, oder habe ich einen
logischen Fehler begangen?

Steh ich auf der Leitung?
Gruß und vielen Dank -Timo-
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von Christian81 »

Der Debugger gibt auch noch mehr aus - nämlich den Backtrace in dem man sieht welcher Code das Problem verursachte. Man sollte sich schon etwas mit dem Entwicklungstool seiner Wahl auseinandersetzen wenn man es benutzen will.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Hi,
nachdem ich nun eine längere Zeit mit dem Debugger versucht hab mein Problem zu lösen, und auch die
QFile Doku immer wieder gelesen habe und doch keinen Hinweis finden konnte, versuche ich es nochmal auf diesem Wege.

Alle Dateien bleiben beim Alten, die hauptfenster.cpp habe ich neu geschrieben, so dass sie übersichtlicher wurde.
Der Teil des Einlesens funktioniert, das hab ich mit dem Debugger herausbekommen. Er kann auch alles Einlesen in das
TableWidget. Auch das Auslesen klappt laut dem Debugger. Nur die Datei kann nicht zum Schreiben geöffnet werden und ich weiß nicht warum - ich habe mehrere Tutorials angeschaut - kann aber keinen Fehler am QFile Syntax finden.

Hier nun mein neugeschriebener Teil der hauptfesnter.cpp:

Code: Alles auswählen

#include "hauptfenster.h"
#include "ui_hauptfenster.h"
#include <QFile>
#include <QString>
#include <QFileDialog>
#include <QTextStream>
#include <Qdebug>

Hauptfenster::Hauptfenster(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Hauptfenster)
{
    ui->setupUi(this);
    connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(readFile()));
}

Hauptfenster::~Hauptfenster()
{
    delete ui;
}

void Hauptfenster::readFile()
{
    int row = 0;

    QString Zeile,str,name,anrede,art,strasse,ort;

    QFile file (QFileDialog::getOpenFileName(this,"Textdatei öffnen", "/", "Textdateien (*.*)"));
    file.open(QIODevice::ReadOnly | QIODevice::Text); // Als Text-Datei nur zum Lesen öffnen
    ui->tableWidget->insertColumn(row);
    while(!file.atEnd())
        {
           QTableWidgetItem *itemA = new QTableWidgetItem();
            Zeile = file.readLine();
            itemA->setText(Zeile);
            ui->tableWidget->insertRow(row);
            ui->tableWidget->setItem(row, 0, itemA);
            row++;
        }
 file.close();

 QString path = QCoreApplication::applicationDirPath() + "/test.xml";
 QFile file_save(path);
 
 if(file_save.open(QIODevice::WriteOnly | QIODevice::Text))
   {
     //qWarning() << "Failed to open" << file_save.fileName() << "for write:";
 
    QTextStream out(&file_save);
    out <<"<?xml version=''1.0'' encoding=''UTF-8'' ?>"<<"\n";
    out <<"<adressen>"<<"\n";
    for (int i=0; i<ui->tableWidget->rowCount(); ++i)
    {

     str=ui->tableWidget->item(i, 0)->text();
     anrede=str.split("//")[0];
     name=str.split("//")[1];
     art=str.split("//")[2];
     strasse=str.split("//")[3];
     ort=str.split("//")[4];
     qDebug() << "anrede" <<anrede <<"name:"<<name;
     out <<"<datensatz>\n";
     out <<"<anrede>" << anrede<<  "</anrede>"<<"\n";
     out <<"<name>" << name <<  "</name>"<<"\n";
     out <<"<art>" << art <<  "</art>"<<"\n";
     out <<"<strasse>" << strasse <<  "</strasse>"<<"\n";
     out <<"<ort>" << ort <<  "</ort>"<<"\n";
     out <<"</datensatz>\n";
     }

    //out <<"</adressen>"<<"\n";
    file_save.flush();
    file_save.close();
    qDebug() <<"Datei wurde erstellt.";
}
}

Gruß und vielen Dank -Timo-
timo_81
Beiträge: 20
Registriert: 6. September 2008 10:08

Re: Erfolgreiches Kompilieren ->Laufzeitfehler...

Beitrag von timo_81 »

Problem gelöst. Thread kann geschlossen werden.
Das Problem war eine fehlerhafte Zeile in der der eingelesenen Datei.

Schönen Abend.
Gruß und vielen Dank -Timo-
Antworten