Qt QFile / QTextStream,无法解析/ proc / stat

时间:2013-04-16 14:33:59

标签: c++ linux qt

我在使用Qt解析/proc/stat时遇到问题。

我遇到的问题是QFile状态/proc/stat是开放的可读。

尝试单独阅读这些行时,QTextStream显然表明流已完成,但我知道运行cat /proc/stat并非如此。

while循环中的所有代码都没有执行。有什么建议或意见吗?

  int UsageStatistics::handle_timeout(const ACE_Time_Value& currentTime, const void* param) {

        INFO("Handling timeout\n");

        QFile file(QString("/proc/stat"));
        if (!file.open(QIODevice::ReadOnly)) {
            ERROR("Unable to open file %s, aborting\n", file.fileName().toStdString().c_str());
            return false;
        }                 

        if (!file.isReadable()) {
            ERROR("Unable to read file %s, aborting\n", file.fileName().toStdString().c_str());
            return false;
        }



        QTextStream in(&file);            
        while (!in.atEnd()) {
            QString line = in.readLine();        

            INFO("%s\n", line.toStdString().c_str());

             /// processing
        }

        file.close();

        return true;          
    }

2 个答案:

答案 0 :(得分:5)

/ proc / stat是一个很小的文件,没有任何巨大的风险。只需将readAll()放入QByteArray(没有atEnd()检查,你已经完成了isReadable()),然后在字节数组中指向QTextStream,如果你想以同样的方式解析它。

QFile file(QString("/proc/stat"));
if (!file.open(QIODevice::ReadOnly)) {
    qDebug("Unable to open file %s, aborting\n", 
        qPrintable(file.fileName()));
    ui->plainTextEdit->appendPlainText("Error can't open");
    return;
}

if (!file.isReadable()) {
    qDebug("Unable to read file %s, aborting\n", 
        qPrintable(file.fileName()));
    ui->plainTextEdit->appendPlainText("Error can't read");
    return;
}

QByteArray contents = file.readAll();

QTextStream in(&contents);
while (!in.atEnd()) {
    QString line = in.readLine();

    qDebug("Read: %s\n", qPrintable(line));

    ui->plainTextEdit->appendPlainText(line);
}

ui->plainTextEdit->appendPlainText("Done reading.");

file.close();

我刚刚验证了我的系统和你的系统一样,然后尝试了这个基于readAll()的方法并且它有效。

答案 1 :(得分:0)

您正在使用cpuRegex.exactMatch,它正在寻找完全匹配整行。您正在寻找的线路上还有其他信息。请尝试使用cpuRegex.indexIn(line) == 0