LINUX.ORG.RU

[qt][парсинг stdout] нужна помощь

 


0

0

Хочу написать сканнер свободного/занятого места на дисках

Получаю вывод df вида

 File System Used Freed Used% Mount point

/dev/sda1 5Gb 5Gb 50% /

Нужно первую строку игнорировать, а вторую (и последующие) разбить на соотвествующие части. Вывод хранится в QString. Как это можно сделать?

★★

Во-первых раз уж пишешь на С++, скачай GNU Coreutils и смотри исходники df. Подсказка: скачать можно отсюда [http://ftp.gnu.org/gnu/coreutils/], сам df.c тебе нах не нужен (тока посмотреть как оно там устроено), тебе нужна только функция get_fs_usage, ее найдешь в тех же coreutils в папке lib, всего 2 файла - fsusage.h и fsusage.c, засунь их себе в проект и будет тебе счастье=) Сишные хедеры подключают так:

extern "C" { #include "fsusage.h" }

Во-вторых если уж совсем хочеться через вывод df, то тебе копать в сторону QStringList::split.

dizza ★★★★★
()

#include <QtCore>
#include <stdlib.h>

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

	QFile f;
	f.open( popen( "df", "r" ), QIODevice::ReadOnly | QIODevice::Text );

	QVector<QStringList> lst;

	f.readLine();
	while( !f.atEnd() ) {
		QString s = f.readLine();
		if( !s.isEmpty() ) {
			lst.push_back( s.split( " ", QString::SkipEmptyParts ) );
		}
	}

	for( int i = 0; i < lst.size(); ++i ) {
		for( int j = 0; j < lst.at( 0 ).size(); ++j ) {
			qDebug( lst.at( i ).at( j ).toUtf8().data() );
		}
	}

	return a.exec();
}

summatus
()

Используй QRegExp.

smh ★★★
()

#include <sys/statvfs.h>
............................
const QString& dirPath = "/mnt/";
qint64 total;
qint64 free;
qint64 available;

struct statvfs fs;
res = (statvfs(QFile::encodeName(dirPath).data(), &fs) < 0);
if(res)
{
total = fs.f_frsize * fs.f_blocks;
free = fs.f_frsize * fs.f_bfree;
available = fs.f_frsize * fs.f_bavail;
}

panter_dsd ★★★★
()
Ответ на: комментарий от Dantix

QString text = ...
QStringList list = text.split( "\n", QString::SkipEmptyParts );

QVector<QStringList> lst;

for( int i = 0; i < list.size(); ++i ) {
	lst.push_back( list.at( i ).split( " ", QString::SkipEmptyParts ) );
}

summatus
()
Ответ на: комментарий от tarcar

Да, что-то, вроде, того, но без kdelibs в зависимостях

Dantix ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.