2012-03-04 9 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

デバッガを使用して、プログラムがクラッシュする場所を正確に特定する必要があります。 –

答えて

3

コードのロジックが複雑すぎます。あなたが興味のある部分を取得するにはQString.splitを使用し

例:。

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

+0

その後、マットに賛成し、彼の答えを受け入れてください! – Koying

1

それはif(i>=data.size())

ランタイムです:

#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の最後の文字を超えているので、エラーはおそらくアサートです。