标题几乎说明了一切,但我最好更具体一点,以免混淆任何人(包括我自己)。
在这两天没有太大的成功。
我有一个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!");
}
}
答案 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");
}