QT:断言:文件 C:\Qt\Qt5.14.2.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 1029

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

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

{ 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" 一行一个字符地复制文件。

这意味着 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;
}

那个代码只读一行,你的代码读多行。

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

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

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