QT:断言:文件 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\include/QtCore/qstring.h 中的“uint(i) < uint(size())”,第 1

Posted

技术标签:

【中文标题】QT:断言:文件 C:\\Qt\\Qt5.14.2\\5.14.2\\mingw73_64\\include/QtCore/qstring.h 中的“uint(i) < uint(size())”,第 1029 行【英文标题】:QT: ASSERT: "uint(i) < uint(size())" in file C:\Qt\Qt5.14.2\5.14.2\mingw73_64\include/QtCore/qstring.h, line 1029QT:断言:文件 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\include/QtCore/qstring.h 中的“uint(i) < uint(size())”,第 1029 行 【发布时间】:2020-04-05 20:16:33 【问题描述】:

我有一个 10 行的文件,我想做一件在这种情况下并不重要的特定事情。到达行尾后,程序崩溃并显示标题中的错误。

我进入了它所引用的头文件行:

 Q_ASSERT(uint(i) < uint(size())); return QChar(d->data()[i]); 

但我还是不明白。这是我的代码块:

  QFile file("file.txt");
  QTextStream in(&file);
  QString s;
  int i = 0;
  while(!in.readLine().at(i).isNull()) 
           s = s + in.readLine().at(i);
           ++i;
       

编辑:我要做的是在 QString 变量“s”中逐个字符地复制文件中的一行。

【问题讨论】:

你为什么要一个字一个字地做?我的意思是 readline() 已经为你读取了一个 QString 。要复制它,您可以使用 operator=()。 s = in.readLine(); 将是您将第一行读入 s 所需的全部内容 如果你想要in.readLine().size() 行的长度应该给你文件中下一行的字符数。 我一个字符一个字符地做,因为我想在某个字符出现后复制到 QString 中。 例如,这是我的行:“Test123 test”。我在这里发布代码之前所做的就是循环直到空白字符。现在我想复制 ("test") 之后的内容。 你可能想要 QString::indexOf() 和 QString::right() 而不是你正在尝试的。 https://doc.qt.io/qt-5/qstring.html#indexOf-1 和 https://doc.qt.io/qt-5/qstring.html#right 【参考方案1】:

这意味着i 不是从readLine() 返回的任何内容的有效索引。换句话说,i 大于行的长度。

循环中的逻辑真的很奇怪。我敢肯定它没有做你认为它正在做的事情。

认为你要写的是这样的

QFile file("file.txt");
QTextStream in(&file);
QString s;
QString line = in.readLine();
int i = 0;
while (!line.at(i).isNull()) 
       s = s + line.at(i);
       ++i;

该代码只读取一行,您的代码读取多行。

【讨论】:

如果条件说:“循环到行尾”怎么办? @Branda 条件根本没有这么说。首先,条件本身读取一行,然后主体读取另一行。您正在循环浏览文件,而不是遍历一行。 为什么不呢? while(!in.readLine().at(i).isNull()) 对我来说是:循环直到到达 '\0' 字符。 @Branda 我认为您正在遍历文件,因为 readLine 就是这样做的,它读取行,如果您多次调用它,它将读取多行。 我不认为 QString 使用空字符来指示字符串(或行)的结尾。但我不确定。但无论如何,如果你想将整行复制到一个字符串中,方法就是一行代码QString s = in.readLine();你不需要写一个循环。【参考方案2】:

我看到了两个问题(除非我误解了 at() 和 readLine() 的工作原理):

1) 在while() 语句中,您正在使用...in.readLine()... 读取一行,但随后在循环中您再次使用另一个...in.readLine()... 读取。所以在第一次迭代开始时你读入一行,然后在循环体执行时再次读入一行。

2) 对于while 的每次迭代,您都在递增i 并从in 中获取该字符。因此,对于第一次迭代 (i=0),您获取第 0 个字符,对于第二次 (i=1),您获取第一个字符....等等。

【讨论】:

事实上,我测试了循环的主体,看看它实际做了什么,但是当我打印 QString 的长度时,它打印了行中的字符数。问题出现在行尾,因为我其实不知道..

以上是关于QT:断言:文件 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\include/QtCore/qstring.h 中的“uint(i) < uint(size())”,第 1的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Qt 程序在断言失败后继续运行?

Qt程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)

使用 CListBox::GetTopIndex() 调试断言。想法?

调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)

带有 QT 错误的 OpenGL:断言:“QOpenGLFunctions::isInitialized(d_ptr)”。无法创建 OpenGL 上下文

QT 一个断言错误的处理 Q_STATIC_ASSERT_X