2012-03-04 110 views
0

我正在使用Qt IDE。以下代碼正在導致Microsoft Visual C++運行時庫錯誤。此外,程序不顯示文本「NewYork」和「London」的項目,顯示「NewYork」和「Londonk」,然後崩潰。這裏是代碼。Qt運行時錯誤

void MainWindow::on_listWidget_itemClicked(QListWidgetItem *item) // creates comments for item 
{ 
    ui->listWidget_2->clear(); 

    ui->commentbutton->setEnabled(true); 
                            QFile files("E:/"+QString::number(ui->listWidget->currentRow())+"com.txt"); 

    if(files.exists()) 
    { 
     if(!files.open(QFile::ReadOnly | QFile::Text)) 
     { 
      QMessageBox::warning(this,"File Access!!!","The File containing data of  the Items and Comments can't be acessed",QMessageBox::Ok); 
      return; 
     } 
     QTextStream in(&files); 
     QString data(in.readLine()); 
     int x=0; 

     QString temp; 

     for(int i=0;;i++) 
     { 
      if(i>data.size()) 
       break; 



      if(data.at(i)!='@' && data.at(i+1)!='#') 
      { 
       temp[x]=data.at(i); 
       x++; 
      } 
      else 
       if(data.at(i)=='@' && data.at(i+1)=='#') 
       { 
        QListWidgetItem *itm=new QListWidgetItem; 

        x=0; 
        i++; 
        itm->setText(temp); 
        ui->listWidget_2->addItem(itm); 
       } 
     } 
     files.close(); 
} 

該程序正確生成Xcom.txt文件(X是一個數字)。從中檢索數據的文件包含此文件

NewYork @#London @#。

+1

您需要使用調試器並找出程序崩潰的位置。 – 2012-03-04 14:57:42

回答

3

您的代碼的邏輯太複雜。使用QString.split讓你感興趣的部分

例:

#include <QtCore> 

int main(void) 
{ 
    QString foo("[email protected]#[email protected]#"); 
    QStringList parts = foo.split("@#", QString::SkipEmptyParts); 
    foreach(QString part, parts) { 
     qDebug() << part; 
    } 
    return 0; 
} 

您的代碼可以減少到類似:

QString data(in.readLine()); 
QStringList parts = data.split("@#", QString::SkipEmptyParts); 
foreach (QString part, parts) { 
    QListWidgetItem *itm=new QListWidgetItem; 
    itm->setText(part); 
    ui->listWidget_2->addItem(itm); 
} 
+0

你是我眼中Qt編程的英雄。我對你的印象非常深刻。我剛開始學習Qt。爲我禱告,我成爲Qt編程的主人。 – scorpion 2012-03-04 16:48:31

+0

然後馬特幫忙,接受他的答案! – Koying 2012-03-04 18:35:32

1

這是if(i>=data.size())

運行時錯誤可能是一個斷言,因爲你超越了你的QString中的最後一個字符。