QFile + QTextStream只读文件的一部分

时间:2019-07-31 13:08:43

标签: c++ qt

我正在为一个项目制作.obj解析器。

我有带loaddata方法的ObjLoader类。并且它逐行读取文件并根据需要对其进行解析。

QFile file(sourceFolder+ QString("/") +filename);
file.open(QIODevice::ReadOnly);
QTextStream textStream(&file);

QString currentString;

while (!textStream.atEnd())
    {
        currentString = textStream.readLine();
        //Some code here without closing file(I doublechecked this) 
    }
file.close()

它可以很好地读取前600个字符串,但随后意外停止。
它发生在以下字符串上:

v 3.956570 0.532126 0.300000
v 3.958734 0.593226 -0.300000
v 3.958731 0.593220 0.300000
vn 0.0000 -0.0000 1.0000
vn 0.0000 0.0000 -1.0000
vn 0.4852 -0.8744 0.0000

但是当我尝试

  

std :: cerr“ <<” currentString.toStdString()“ <<”“ \ n”;
  (很抱歉,不知道如何使用stackoverflow格式正常编写此代码)

对于这些字符串,通过使用索引“ int i”(每次在循环中递增),它仅提供以下内容:

v 3.956570 0.532126 0.300000
v 3.958734 0.593226 -0.300000
v 3.958731 0.593220 0.300000
v

在这一点上,它停止读取文件而没有任何错误。看起来内存中的文件到此结束。但是,当文件中有1100多个字符串时,它只是第601个字符串。

我在文本编辑器中检查了文件中是否存在无法打印的符号,但是本部分中没有任何符号。

每次我开始调试此代码时,它都会执行相同的操作-相同的字符串将使相同符号处的读数停止。为什么会发生?

1 个答案:

答案 0 :(得分:0)

显然,textStream.atEnd()是not always a reliable indicator that you're actually at the end of a stream.,我将尝试使用textStream.ReadAll()来查看是否以这种方式获取了整个文件。另外,您可以只调用textStream.readLine()直到它返回NULL并使用它来打破while循环:

currentString = textStream.readLine();
while (!currentString.isNull())
    {
        //Some code here without closing file(I doublechecked this) 
        currentString = textStream.readLine();
    }