2009-12-20 5 views
0

Je suis en train de suivre le fichier attaché 1.txt.Erreur qlist lors de l'exécution de qprocess dans une boucle

a) lire une liste b) pour chaque élément dans la liste c) exécuter un processus externe enregistrer dans un fichier d) lire un fichier, sauf modification dans le fichier de B e) thatz il

et une erreur de suivi se produit.

échec ASSERT dans QList: pérateur []: "indice hors de portée", fichier /opt/qtsdk-2009.02/qt/include/QtCore/qlist.h, ligne 403

2.txt est une instance du fichier 1.txt (pas de boucle) et il fonctionne avec succès.

Comment est-il possible d'exécuter la boucle avec succès en modifiant le fichier. Veuillez suggérer avec un exemple. Ça va aider. PS: vous aurez besoin du fichier queue_output.txt dans le dossier tmp pour exécuter ce code.

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

L'avez-vous exécuté à l'aide d'un débogueur et trouvé lorsque vous sortez de l'index, c'est-à-dire où les choses vont mal dans votre code? – e8johan

+0

Savez-vous que vous pouvez créer des fonctions et des classes en C++ pour structurer votre code ... – TimW

Répondre

0

Vous utilisez le mauvais index ici ...

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

Je ne sais pas ce que vous voulez mais l'index i n'a rien à voir avec la scission de la ligne QString(line).split("\n");.
Je suppose que vous voulez que ce lineWithoutSlashAnne_02 = lineWithoutSlashAnne_01[0];

Il suffit de remplacer le laid en boucle avec:

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

Vous avez une fuite de mémoire, procQueueContent est jamais supprimé.

Questions connexes