QTextStream使用已知变量比较csv文件中每行的第一个字符?

时间:2016-03-04 02:54:57

标签: c++ qt csv

标题几乎说明了一切,但我最好更具体一点,以免混淆任何人(包括我自己)。

在这两天没有太大的成功。 我有一个CSV文件,并逐行打开/读取QTextStream。行长度仅设置为每行的第一个字符line.at(0)。它将每行的开头与已知变量/整数进行比较。 它有效,标签显示" Match Found"但紧接着,应用程序崩溃了。它永远不会到达" No Matches Found"。

我得到的错误:

ASSERT: "uint(i) < uint(size())" in file ..\..\..\..\Qt\5.0.2\mingw47_32\include/QtCore/qstring.h, line 729
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

有什么想法吗?任何人吗?

哦,是的,这是导致这种头痛的功能代码。

void DialogToll::ReadAndCompare()
{


QString Number = ui->Tolls->text();


QFile filetoCompare("C:/Tolls.txt");

if(filetoCompare.open(QIODevice::ReadOnly | QIODevice::Text))
{
        QTextStream stream(&filetoCompare);
        QString line;
        do
        {
            line = stream.readLine();
            if(line.at(0)== Number)
            {
                ui->label->setText("match Found!!!");
            }
        }while(!line.isNull());
        ui->label->setText("No match Found!");

}
}

2 个答案:

答案 0 :(得分:1)

您逐行读取文件,但看起来某些行的长度为零,因此line.at(0)失败。我会通过以下方式改进您的代码:

[..]
QTextStream stream(&filetoCompare);
do
{
    QString line = stream.readLine();
    if (line.size() > 0 && line.at(0) == Number)
    {
        ui->label->setText("match Found!!!");
    }
} while (!line.isNull());
ui->label->setText("No match Found!");
[..]

请注意,我在比较第一个字符之前检查了行的长度。

答案 1 :(得分:0)

就像@Vahancho说的那样:在访问它的元素之前,你没有检查你的行。这将导致空行崩溃。

您是否意识到在循环后覆盖了ui标签 完了吗?您可以通过提前返回来防止这种情况:

接下来,您可能希望使用QRegexp的强大功能:

void checkMatch() {
....
  QRegexp expr("^"+ui->Tolls.text());
  do {
      auto line = stream.readLine();
      if (expr.exactMatch(line)) {
         ui->label->setText("Match");
         return; // <<<< early return
      }
  } while(!stream.atEnd());
  ui->label->setText("no match");
}