[sloved]QString Zerlegen und im Array Speichern

Alles rund um die Programmierung mit Qt
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag von jd »

ObeliX hat geschrieben:

Code: Alles auswählen

if(list.size()<6) {
  QMessageBox::warning(this,"Error","Ich bin garnicht lang genug !!!\n");
  continue;
}
Die MessageBox geht immer auf.

Dann habe in meinen Code ein Q_ASSERT hinzugefügt, was auch immer anspringt...

Code: Alles auswählen

while (!in.atEnd()) {
		line = in.readLine();
		QStringList list;
		list = line.split(QRegExp("\\s+"), QString::SkipEmptyParts);
		if (list.size()<6) {
			QMessageBox::warning(this,"Error","Ich bin garnicht lang genug !!!\n");
			continue;
		}
		Q_ASSERT(list.size()<=6);
Ich habe das Gefühl das ich die sache komplett falsch angegangen bin, den Festplattenspeicher auszulesen, ich habe mit gedacht das wird schon kein Hexenwerk sein :evil:

Ich glaube das dass Irgendwas mit FILE QFile und QTextStream zu tun hat. Nur komme ich nicht darauf wo der Fehler liegt...

Nehmen wir mal an popen ist der Auslöser des Problems, und der Fehler zieht sich durch das ganze Programm, welche alternativen bleiben mir denn sonst noch? Ich finde einfach das wenn man df parst alles Daten am besten raus bekommt, und ich wollte einfach nicht das ich df in eine txt Datei umleiten muss um es zu parsen, da ich das etwas unschön finde.

Ich weiß einfach nicht wo der verdammte Fehler ist... der Debugger, den ich habe zeigt mir keine Variablen an (jedenfalls nicht den Inhalt) nur so was wie 0x080... ; na ganz großes Kino, damit kann ich nicht wirklich was anfangen :(

Hat jemand noch eine Idee was man da machen kann? Ansonsten muss ich mich wohl nach einer anderen Lösung umsehen wie ich den Platten platz raus bekomme, weil das ist ein Krampf... Meine Struktur ist richtig, QList auch... Ich zerlege das ganze auch korrekt, in meinem Programm wird sogar alles angezeigt so wie es soll ... Also kann ich den Fehler erst recht nicht nachvollziehen.

so long
jd
jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag von jd »

Ich habe das ganze mal ohne QTextStream gemacht, sonder nur auf QFile aufgebaut, da kommt der Fehler sofort und auch immer, im Klartext da startet das Programm gar nicht... Im Debugger gibt es nichts neues, also funktioniert QTextStream besser, aber noch nicht so wie es soll, hat jemand eine Idee wie ich das anders machen kann.

Ich wage fast zu behaupten das der Fehler zwischen QTextStream und popen liegt, wie oben schon mal vermutet wurde.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Das ist doch auch keine Hexerei:
mit "popen()" wird dein Prozess "geforkt". Klingt obszön, ist es aber nicht:
Dein Prozess wird vom Kernel zuerst geklont und danach in einen anderen Prozess umgewandelt (fork/exec). D.h. dein "df" beginnt als zweiter Prozess neben deinem eigentlichen zu laufen. Siehst du, wo das Problem liegt? Manchmal hast du die Ausgabe, manchmal nicht.....

Die Lösung: mach dir nicht das Leben schwer und nimm anstelle von popen ein "QProcess". Hier hättest du zwar das Problem mit der Nebenläufigkeit auch, aber "waitForFinished()" hilft, denn da wartet dein Programm auf das Ende des "df"-Prozesses. Und danach übernimmt "readAllStandardOutput ()" alles, was du mit dem FILE*-Gepfrimel realisieren wolltest..
Thorsten
Beiträge: 55
Registriert: 29. Dezember 2004 22:47
Wohnort: Aachen

Beitrag von Thorsten »

Ich glaube es liegt daran, dass du das struct innerhalb der Funktion deklarierst. Das geht in C++ nicht.

Code: Alles auswählen


#include<QList>

struct SHardDrive {
      QString filesystem;
      QString size;
      QString used;
      QString avail;
      QString usedPercent;
      QString mountPoint;
};

QList<SHardDrive> meineFunktion(...in...)
{
   QList<SHardDrive> daten; // Compiler meckert
   while (!in.atEnd()) {
      QStringList list = in.readLine().split(QRegExp("\\s+"), QString::SkipEmptyParts);

      hdd.filesystem = list[0];
      hdd.size = list[1];
      hdd.used = list[2];
      hdd.avail = list[3];
      hdd.usedPercent = list[4];
      hdd.mountPoint = list[5];

      daten.append(hdd); // Compiler meckert
   }
...
}

jd
Beiträge: 130
Registriert: 22. Januar 2008 17:55

Beitrag von jd »

Thorsten hat geschrieben:Ich glaube es liegt daran, dass du das struct innerhalb der Funktion deklarierst. Das geht in C++ nicht.
Das ist mir neu, wenn das der Fall wäre, würde der Compiler meckern.

Aber nichts des so trotzt, das Problem ist gelöst, das mit QProcess ist 1. um einiges einfacher und funktioniert ohne Probleme. Hier ist mein vollständiger Code, der funktioniert.

MainWindow.h

Code: Alles auswählen

#ifndef MAINWINDOW_H_
#define MAINWINDOW_H_
#include <QtGui>
#include "../../build/ui_MainWindow.h"

class CMainWindow : public QMainWindow, private Ui::MainWindow {
	Q_OBJECT
	public:
		CMainWindow();
		~CMainWindow();
	private:
		QDialog *aboutDialog;
		QProcess *readPartition;
		typedef struct {
			QString filesystem;
			QString size;
			QString used;
			QString avail;
			QString usedPercent;
			QString mountPoint;
		} SHardDrive;

		QList<SHardDrive*> disk;
		void calculateDiskSpace();
};

#endif /*MAINWINDOW_H_*/

MainWindow.cpp

Code: Alles auswählen

#include "MainWindow.h"
#include "../DialogAbout/DialogAbout.h"

CMainWindow::CMainWindow() {
	setupUi(this);

	calculateDiskSpace();
}

CMainWindow::~CMainWindow() {}

void CMainWindow::openDialogAbout() {
	aboutDialog = new CDialogAbout;
	aboutDialog->show();
}

void CMainWindow::calculateDiskSpace() {
	QString cmd("df");
	readPartition = new QProcess(this);
	readPartition->start(QFile::encodeName(cmd).data(), QStringList() << "-h");
	if (!readPartition->waitForFinished()) {
		QMessageBox::warning(this, tr("Error"), tr("Could not allocate disk space\n"));
		return;
	}

	QString line = readPartition->readAll();
	if (line == NULL) {
		QMessageBox::warning(this, tr("Error"), tr("Could not read data stream\n"));
		return;
	}

	QStringList partitionLine = line.split("\n", QString::SkipEmptyParts);
	SHardDrive *hdd = NULL;
	for (int i = 0; i < partitionLine.size(); i++) {
		QRegExp rx("/dev/*");
		rx.setPatternSyntax(QRegExp::Wildcard);
		if (rx.exactMatch(partitionLine[i])) {
			QStringList partitionSplit = partitionLine[i].split(QRegExp("\\s+"), QString::SkipEmptyParts);
			hdd = new SHardDrive;
			disk.append(hdd);
			hdd->filesystem = partitionSplit[0];
			hdd->size = partitionSplit[1];
			hdd->used = partitionSplit[2];
			hdd->avail = partitionSplit[3];
			hdd->usedPercent = partitionSplit[4];
			hdd->mountPoint = partitionSplit[5];
		}
	}

	QString test;

	for (int i = 0; i < disk.size(); i++) {
		test.append(disk[i]->filesystem);
		test.append("\t");
		test.append(disk[i]->size);
		test.append("\t");
		test.append(disk[i]->used);
		test.append("\t");
		test.append(disk[i]->avail);
		test.append("\t");
		test.append(disk[i]->usedPercent);
		test.append("\t");
		test.append(disk[i]->mountPoint);
		test.append("\t\n");
	}

	labelDiskSpace->setText(test);

	QRegExp rx("%");
	QString tmp = disk[0]->usedPercent.replace(rx, "");

	int x = tmp.toInt();
	int y = 16;

	QSize newSize(x, y);
	frameDrive1->resize(newSize);
	frameDrive1->setStyleSheet("border: 2px solid green; border-radius: 4px; padding: 2px; background-color: orange;");

	labelDiskSpace->adjustSize();
}
Ich bedanke mich bei allen, die mir so tapfer zu Seite gestanden haben :)
Antworten