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程序调试之Q_ASSERT断言(条件为真则跳过,否则直接异常+崩溃)
使用 CListBox::GetTopIndex() 调试断言。想法?
调试断言失败(无符号)(c+1)<= 256(在 VideoCapture::open [Qt Creator] 中)
带有 QT 错误的 OpenGL:断言:“QOpenGLFunctions::isInitialized(d_ptr)”。无法创建 OpenGL 上下文