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
),您获取第一个字符……等等。
我有一个 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
),您获取第一个字符……等等。