Ошибка qlist при запуске qprocess в цикле - PullRequest
0 голосов
/ 20 декабря 2009

Я делаю следующее в прикрепленном файле 1.txt.

а) читать список б) для каждого элемента в списке в) запустить внешний процесс сохранить его в файл d) прочитать файл A, сохранить изменения в файле B е) это все

и возникает следующая ошибка.

Ошибка ASSERT в QList: perator []: «индекс вне диапазона», файл /opt/qtsdk-2009.02/qt/include/QtCore/qlist.h, строка 403

2.txt - это один экземпляр файла 1.txt (без цикла), и он успешно работает.

Как можно успешно запустить цикл, изменяя файл. Пожалуйста, предложите с примером. Это поможет.

PS: вам понадобится файл queue_output.txt в папке tmp для запуска этого кода.

1.txt

#include <QtCore/QCoreApplication>
#include <QRegExp>
#include <QProcess>
#include <QDebug>
#include <QTemporaryFile>
#include <QDir>


int main(int argc, char *argv[])
{
//      int ret = 0;
        QString projNm = "edisni";
        QCoreApplication app(argc, argv);
        QStringList arguments;

        QString queue;
        QStringList queueList;
        QTextStream out;
// ---------------------------------------------
// till here i get a list of queues in queueList
// ---------------------------------------------

        QFile file("/tmp/queue_output.txt");
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream in(&file);
            queue = in.readAll();
        }
        file.close();

        queueList = QString(queue).split("\n");

        if (QString(queueList.last()).isEmpty())
            queueList.removeLast();


// ----------------------------------------------
// for each item in queueList run an external command
// store output in _XXXXXX

        qDebug() << "length of queue" << queueList.length();

        for(int i =0; i < queueList.length();i++)
        {
            QProcess *procQueueContent = new QProcess();
            QString lineWithoutSlashAnne_02;

            QTemporaryFile *tFile = new QTemporaryFile(QDir::tempPath()+ "/" + queueList[i] + "_XXXXXX");
            tFile->open();

            QFile pFile("/tmp/queue_content_output.txt");
            pFile.open(QIODevice::WriteOnly);

            procQueueContent->setStandardOutputFile(tFile->fileName());
            procQueueContent->setStandardErrorFile("/tmp/queue_content_error.txt");

            arguments << "-sq" << queueList[i];
            procQueueContent->start("qconf",arguments);

            procQueueContent->waitForReadyRead();
            procQueueContent->waitForFinished();

            tFile->close();
            tFile->open();

            QTextStream out(&pFile);
            QString line;

// ---------------------------------------------
// find word projects in the file, add a word at end
// save output in queue_content_output
// ---------------------------------------------

            while(!tFile->atEnd())
            {

                line = tFile->readLine();
                QStringList lineWithoutSlashAnne_01 = QString(line).split("\n");

                lineWithoutSlashAnne_02 = lineWithoutSlashAnne_01[i];
                if (lineWithoutSlashAnne_02.contains(QRegExp("^projects")))
                {
                    lineWithoutSlashAnne_02.append(" "+projNm);
//  come a line back remove the project line and add this line
                    qDebug() << "project " << lineWithoutSlashAnne_02;

                }
                out << lineWithoutSlashAnne_02 << endl;
            }

            tFile->close();
            pFile.close();

            arguments.clear();
        }
        return app.exec();
}

2.txt

#include <QtCore/QCoreApplication>
#include <QRegExp>
#include <QProcess>
#include <QDebug>
#include <QTemporaryFile>
#include <QDir>
#include <iostream>


int main(int argc, char *argv[])
{
//      int ret = 0;
        QString projNm = "edisni";
        QCoreApplication app(argc, argv);
        QStringList arguments;


// ---------------------------------------------
// till here i get a list of queues in queueList
// ---------------------------------------------

        QString queue;
        QStringList queueList;
        QFile file("/tmp/queue_output.txt");
        if(file.open(QIODevice::ReadOnly))
        {
            QTextStream in(&file);
            queue = in.readAll();
        }
        file.close();

        queueList = QString(queue).split("\n");

        if (QString(queueList.last()).isEmpty())
            queueList.removeLast();

// ---------------------------------------------
// for only first item in queueList[0] run external comm 
// ---------------------------------------------

        QProcess *procQueueContent = new QProcess();
        QString lineWithoutSlashAnne_02;

        QTemporaryFile *tFile = new QTemporaryFile(QDir::tempPath()+ "/" + queueList[0] + "_XXXXXX");
        tFile->open();

        QFile pFile("/tmp/queue_content_output.txt");

        pFile.open(QIODevice::WriteOnly);

        procQueueContent->setStandardOutputFile(tFile->fileName());
        procQueueContent->setStandardErrorFile("/tmp/queue_content_error.txt");
        arguments << "-sq" << queueList[0];

        procQueueContent->start("qconf",arguments);
        procQueueContent->waitForReadyRead();
        procQueueContent->waitForFinished();


        tFile->close();
        tFile->open();

        QTextStream out(&pFile);
        qDebug() << "pFIle " << &pFile;
        QString line;
        while(!tFile->atEnd())                                          // add a condition to restrict traversing thru file only once
        {
            line = tFile->readLine();
            QStringList lineWithoutSlashAnne_01 = QString(line).split("\n");
            lineWithoutSlashAnne_02 = lineWithoutSlashAnne_01[0];
            if (lineWithoutSlashAnne_02.contains(QRegExp("^projects")))
            {

                lineWithoutSlashAnne_02.append(" "+projNm);

                qDebug() << "project " << lineWithoutSlashAnne_02;
//  come a line back remove the project line and add this line
            }
                out << lineWithoutSlashAnne_02 << endl;            
        }

        tFile->close();
        pFile.close();

        arguments.clear();
        return app.exec();
}

queue_output.txt:

all.q
eqws-069.q
grid.q
grid1.q
grid3.q
test.1.q

1 Ответ

0 голосов
/ 23 декабря 2009

Вы используете неправильный индекс здесь ...

//...
QStringList lineWithoutSlashAnne_01 = QString(line).split("\n");  
lineWithoutSlashAnne_02 = lineWithoutSlashAnne_01[i];
//...

Я не знаю, что вы хотите, но индекс i не имеет ничего общего с разделением строки QString(line).split("\n");.
Я думаю, вы хотите это lineWithoutSlashAnne_02 = lineWithoutSlashAnne_01[0];

Просто замените уродливый цикл while на:

foreach(QByteArray line, tFile->readAll().split("\n"))
{
    if(line.endsWith(projects))
    {
        line << " " << projNm;
    }
    out << line << endl;
 }

У вас есть утечка памяти, procQueueContent никогда не удаляется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...