Seite 1 von 3

Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 13. Juli 2011 15:21
von mutantmonkey
Ziel dieses Schrittes in meinem Programm soll sein, dass der User eine TextDatei einladen kann welche x und y Koordinaten enthält, welche im nächsten Schritt als Grafik ausgegeben werden sollen.

Ich bin nun soweit dass ich textdateien einladen kann und diese ja auch als QString gespeichert werden und danach in einem Textfeld angezeigt werden.

Meine Frage ist nun wie mache ich weiter.
Wie und an Welcher Stelle muss ich die ausgelesenen Koordinaten mit x und y werten belegen damit ich diese hinterher zeichnen lassen kann?

Code: Alles auswählen

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



int main(int argc, char *argv[])
{

    QApplication a(argc, argv);



    MainWindow* w =new MainWindow;
    window->show();

    return a.exec();
}

Code: Alles auswählen

 #include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QMainWindow *parent, Qt::WindowFlags flags) :

/
    QMainWindow(parent, flags),

    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(ui->pushButton, SIGNAL(clicked()), qApp, SLOT(quit()));

    connect(ui->pushButtonopen, SIGNAL(clicked()), this, SLOT(openFile()));

}
void MainWindow::openFile()
{

    QString fileName;
    fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"","Alle Dateien(*.*)");
    if(!fileName.isEmpty())
    {
        QFile file(fileName);
        if (file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
        ui->plainTextEdit->setPlainText(file.readAll());

}
    }
}
//
MainWindow::~MainWindow()
{
    delete ui;
}

Code: Alles auswählen

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTextEdit>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>

namespace Ui {
    class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QMainWindow *parent=0, Qt::WindowFlags flags=0);
    ~MainWindow();
public slots:
    void openFile();

private:


    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
die dateien sind aufgebaut: zeile 1: x y
Zeile 2: xWert yWert
vielen da nk schonmal im voraus

Verfasst: 15. Juli 2011 06:33
von Christian81
Einfach die Datei z.B. per QTextStream Zeile für Zeile lesen und mit QString - Funktionen wie split() auseinandernehmen.

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 16:27
von mutantmonkey
danke für den denkanstoß,
hab das ganze nun in einem QTextStream gespeichert (hoffe ich zumindest) jedoch fehlt mir jetzt mal wieder das nötige geschick die split funktion einzubauen

mein neuer code:

Code: Alles auswählen

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QMainWindow *parent, Qt::WindowFlags flags) :


   QMainWindow(parent, flags),

   ui(new Ui::MainWindow)
{
   ui->setupUi(this);

   connect(ui->pushButtonquit, SIGNAL(clicked()), qApp, SLOT(quit()));

   connect(ui->pushButtonopen, SIGNAL(clicked()), this, SLOT(openFile()));

   connect(ui->pushButtonsave, SIGNAL(clicked()), this, SLOT(saveFile()));

}
//Datei Öffnen und in String mit QTextStream zeilenweise auslesen


void MainWindow::openFile()
{
    QString fileName;
    fileName = QFileDialog::getOpenFileName(this, tr("Open File"),"","Alle Dateien(*.*)");

    QFile file(fileName);
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    return;
    //lese als TextStream bis zum Ende
        QTextStream in(&file);
    while (!in.atEnd())
    {
        //this reads the line from QFile
        QString line = in.readLine();
        //damit alle Zeilen Angezei
        line = in.readAll();
        //zeige Zeile an
        ui->plainTextEdit->setPlainText(line);
    }
}

//bis jetzt specihern einer leeren Text datei
void MainWindow::saveFile()
{

   QString fileName;
   fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"",tr("Text Files (*.txt);;C++ Files (*.cpp*.h)"));
   if(fileName !="")
   {
       QFile file(fileName);
       if (!file.open(QIODevice::ReadWrite)){




           }

}
}
//
MainWindow::~MainWindow()
{
   delete ui;
}
danke für weitere Hilfe

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 17:37
von Christian81
Wo genau ist jetzt das Problem? line.split(' ') und fertig... :roll:

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 18:09
von mutantmonkey
habe jetzt

QStringList Koords =line.split(",");

bekomme jedoch folgende Fehlermeldung
undefined refeence to MainWindow::slpit()

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 18:37
von upsala
Die Fehlermeldung passt aber nicht zu deinem Code.

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 18:48
von mutantmonkey
jetzt klappt es, habe mal alles neugestartet

ok jetzt habe ich mein Text Zeile für Zeile eingelesen jetzt müsste ich doch meine Liste Koords definieren können sodass jede eingelesen Zeile mit den ersten Zahlen bis zur Leerstelle einem xWert zuweist und die weiteren Zahlen einem YWert oder?

line:[erste Zahlen = xWert, weitere Zahlen =yWert]

wäre das so irgendwie möglich?

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 17. Juli 2011 18:56
von Christian81
Sorry aber ein wenig C und C++-Grundlagen sind schon nötig. Dann wüsstest Du auch wie man eine Struktur definiert (oder einen stl und/oder Qt-Container verwendet)
z.B. QVector<QPoint> oder std::vector<std::pair<float,float> >

-> C++ Grundlagen

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 29. Juli 2011 17:00
von mutantmonkey
habe jetzt versucht meine C++ Grundlagen ein zu erweitern, jedoch stehe ich immer noch vor einer wand und habe noch immer keine ahnung wie das funktionieren könnte.

habe nun etliche sachen mit qvector<qpoint> ausprobiert und bekam nur fehlermeldungen

vielleicht könnte mir jemand nocheinmal hilfestellung geben wie das ganze ungefähr aussehen müsste

letzter stand sieht nun so aus:

Code: Alles auswählen

//Hiermit sollte ich doch meine Eingelesene Textdatei über QString in QTextStream umgewandelt haben welcher jeden Zeile bis zum ende des files durchliest?? 
QTextStream stream(&file);
QString line ) stream.readLine();
line=stream.readAll();
// nehme für jede Zeile einen Punkt welcher ja x und y Koordianten enthält
QVektor<QPoint> line;
// Starte ab Zeile 3 und ignoriere Zeile 1-2
for ( int i=0, i>2, i++)

wie man merkt bin ich total überfordert muss das ganze jedoch für die uni machen und hab noch immer keinen grünen faden gefunden um mit dem programmieren weiter zu kommen

danke für jede hilfe

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 29. Juli 2011 17:40
von upsala
Was ist ein QVektor?

Was willst du damit?

Code: Alles auswählen

QString line ) stream.readLine();
For-Schleifen sind in allen Programmiersprachen gleich und gehören somit zu den absoluten Grundlagen.

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 29. Juli 2011 17:52
von mutantmonkey
danke für die schnelle antwort

ok werde mich jetzt nochmals genaustens mit der for schleife beschäftigen , habe gedacht ich hätte das schon verstanden wie das funktioniert(wenn ich das in büchern lese erscheint mir das auch logisch nur wenn ichs selbst anweden will ists immer noch sehr kompliziert)

Code: Alles auswählen

QString line = stream.readLine();
sollte es sein, und damit sag ich doch er soll eine zeile lesen , was unsinnig ist da das ja QTextStream sowieso macht oder?

und QVector ist soweit ich das richtig verstanden habe ein Speicherplatz wo meine Koordinaten gespeichert werden, welche ich dann von da aus als Punkt mit x und y koordinaten speicher kann?

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 29. Juli 2011 18:35
von franzf
mutantmonkey hat geschrieben:

Code: Alles auswählen

QString line = stream.readLine();
sollte es sein, und damit sag ich doch er soll eine zeile lesen , was unsinnig ist da das ja QTextStream sowieso macht oder?
QTextStream macht nur das was du ihm sagst. Wenn du willst, dass er eine Zeile einliest, musst du ihm das auch sagen. Ich versteh nicht, wo das Problem ist.
Dein Problem oben war eigentlich, dass du in der Schleife ein readLine() UND ein readAll() stehen hattest. readAll() liest alles ein und setzt den Dateizeiger auf das Ende - somit wird die Schleife genau einmal durchlaufen, du hast einen riesigen Batzen in line, definitiv aber keine einzelne Zeile.
Entweder liest du wirklich Zeile für Zeile (readLine() in einer Schleife), oder du liest alles auf einmal, dann aber ohne Schleife. Beides ist möglich, beide haben Vor- und Nachteile.
und QVector ist soweit ich das richtig verstanden habe ein Speicherplatz wo meine Koordinaten gespeichert werden, welche ich dann von da aus als Punkt mit x und y koordinaten speicher kann?
QVector ist ein (generischer) Container. Der kann ALLES speichern, so lange es konstruier-, kopier- und zerstörbar ist. Im Prinzip ist es eine Objektorientierte Abstraktion eines Arrays, mit einigen bequemen Features (automatische Größenanpassung, Container kann einfach kopiert werden, Bereichsprüfungen usw.).
Ein QVector kann zwar zum halten eines Vektors im grafischen Sinne (also Aneinanderreihung von zusammengehörigen Punkten) benutzt werden, ist aber nicht die alleinige und ausschließliche Benutzung.

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 30. Juli 2011 10:47
von mutantmonkey
danke franzf für die ausführliche erklärung
ok ich möchte das ganze zeile für zeile auslesen somit fiegt readAll raus,
somit würde ich das ganze mit einer schleife machen

Code: Alles auswählen

QString line = stream.readLine();
//jetzt kommt meine schleife
// Starte ab Zeile 3 und ignoriere Zeile 1-2, mit line++ durchlaufe file bis ende
for ( line=0, line>2, line++)
{
//jede line soll als QPoint gespeichert werden
//hier müsste ich  doch auch noch irgendwie sagen was jetzt der x wert ist und was der ywert???speichere ich mit der Zeile jede durchlaufene Zeile als QPunkt?
QVektor<QPoint> line;
}
oder muss ich noch eine klasse QPoint erstellen wo cih dann meine Koordinaten definiere??


geht das so in die richtige richtung?

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 30. Juli 2011 11:25
von franzf
Du solltest dir erstmal überlegen, wie das Format deiner Datei aussehen soll, also wie die Punkte abgespeichert werden - vorher kann man auch nicht genau sagen, wie du das einlesen sollst.
Wenn das passt, formulierst du in Worten, was passieren soll.
Angenommen, du hast eine Datei, in der jede Zeile einen Punkt enthält, dann könnte sich der Einlese-Algorithmus so anhören:

Code: Alles auswählen

So lange die Datei nicht zu Ende ist:
    Lese neue Zeile in QString line.
    Extrahiere aus line die beiden Koordinaten in int x, int y.
    Speichere x und y passend in einem QPoint point.
    Füge point meinem QVector<QPoint> points hinzu.
Wo liegt das Problem in dieser "Bedienungsanleitung"?

Evtl. kannst du dir aber auch mal QSettings anschauen, da solltest du gleich einen QVector<QPoint> reinhauen können.

Re: Textdatei Koordinaten auslesen und als QString speichern

Verfasst: 30. Juli 2011 13:19
von mutantmonkey
danke für die Bedienungsanleitung, das hilft mir schonmal die Struktur richtig zu verstehen.

ja ich will zuerst ein file einlese das wie folgt aufgebaut ist
123 567
124 987
154 976

erste spalte sind xKoordinaten zweite dann yKoordinaten

habe versucht die Bedienungsanleitung umzusetzen und soweit wäre ich schoneinmal und hoffe das ich jetzt nicht wieder einmal nur unsinn poste

Code: Alles auswählen

QTextStream stream (&file);
while(!file.atEnd())
{
QString line = stream.readLine();
for (int line=0; line++)
{ 
line = getLine(intx; inty);
QPoint point = line;
QVector<QPoint> point;              
}
}
kann ich das so irgendwie umszuetzen??