2013-07-20 89 views
1

我想問你的幫助,我的小學校項目。 的任務是確定一個人的性別(使用2個單選按鈕),然後選擇一個隨機的日本姓和男/女中間名。還有剩下的任務,但沒有什麼比這部分:( 事情是,我設法使3個.txt文件(familynames.txt,malemiddlenames.txt和femalemiddlenames.txt)看起來像下面: 1,Akiro 2,Sakura 3等...從txt文件中讀取隨機行,然後在QT SDK中修改它

我想要做的是創建一個隨機數,並讀取行,直到它到達與我的隨機數相同的數字的行,然後切成數和逗號關閉,並顯示相應的標籤上的名字到目前爲止,這是我已經有了:

void MainWindow::famname() 
{ 
    QString familyname; 
    int famrand =qrand() % 76; 
    ui->label_2->setText(QString::number(famrand)); 
    int i = 1; 

    QFile famfile("C:\Users\Ryseth\gyakorlas\_familynames.txt"); 
    QTextStream in(&famfile); 
    if(famfile.open(QIODevice::ReadOnly)){ 

     while (!in.atEnd()) { 
      QString line = in.readLine(); 
      i++; 
      if(i==famrand){ 
       QStringList line2 =line.split(','); 
       familyname = line2.at(0); 
       ui->label_2->setText(QString::number(famrand)+" "+QString::number(i)); 
       ui->FamilyLabel->setText(familyname); 
      }//IF 
     }//WHILE 
    }//IF 
     famfile.close(); 
}//NGEN 

如果任何你能想到一些長遠發展策略研究溶液T或如果您有任何建議,請不要hasitate與我分享:d

謝謝大家,有一個很好的晝/夜:魯本

+0

「如何將行讀入數組」然後從數組中隨機選取一個元素。讀取文件中的「隨機」行仍涉及通過文件掃描換行符,直到找到想要的行。 –

+0

它也跨越了我的想法,但後來我採取了更難的方式:D – Ryseth

+0

您是否會在應用程序生命週期中生成多個名稱?如果是,那麼讀取所有行(只有一次)將是更好的方法。 – 2013-07-20 15:17:26

回答

1

我想用升壓::靈::齊,你可以分析您的文件轉換爲std::vector< std::string >,用簡單的C++方法做你的操作。

但是,爲了幫助您與您的Qt的解決方案:

你永遠不會檢查是否int famrand =qrand() % 76;產生一個合法的數字,是否有足夠的條目在文本文件中...

int i = 1;這個整數是不必要的,在數字是文本文件中...

我的解決方案(未經測試):

while (!in.atEnd()) { 
    QString line = in.readLine(); 
    QStringList list = line.split(",", QString::SkipEmptyParts); 
    bool ok; 
    int idx = list.at(0).toInt(&ok); 
    if (ok && idx == famrand) { 
    familyname = list.at(1).trimmed(); 
    // ... do with your ui whatever you want 
    }//IF 
}//WHILE 

記住ÿ如果將字符串轉換爲int失敗和/或列表拋出的訪問器不得不進行錯誤處理(list.at(xx)

正面的事情是,你不需要一個有序的文本文件!

+0

嗨,謝謝你的迴應。理論上它應該工作(至少我沒有得到任何錯誤信息,當我調試它。howerver它不能識別文本文件=(無論我是否將它複製到項目的位置(並且只需調用它與「QFile famfile(_familynames.txt)」)或使用目標文件夾的路徑(C:\ Users \ Ryseth \ gyakorlas \ _familynames.txt)。除此之外它似乎很好。 – Ryseth

+0

一個項目和它工作正常... 你確定你的家人是有效的(例如文本文件中有對應的值嗎?) 此外,還有一個錯誤(familyname = list.at(1).trimmed();) –

0

我真的不明白你正在設法做,但在這條線上,我猜你得到的是數字,而不是家族名稱。

familyname = line2.at(0); // number 
familyname = line2.at(1); // family name 
+0

以及嗯,我希望返回一個隨機線在txt文件中的姓氏,並將其顯示在Label.i中,這就是爲什麼我需要'familyname = line2.at(1)'的原因。部分 – Ryseth

相關問題