首页 > 解决方案 > QFile + QTextStream 只读文件的一部分

问题描述

我正在尝试为一个项目制作 .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

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

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

每次我开始调试这段代码时,它都会做同样的事情——相同的字符串会在相同的符号处停止读取。为什么会发生?

标签: c++qt

解决方案


显然 textStream.atEnd()并不总是一个可靠的指标,表明您实际上处于流的末尾。我会尝试 textStream.ReadAll() 看看你是否以这种方式获取整个文件。或者,您可以调用 textStream.readLine() 直到它返回 NULL 并使用它来中断 while 循环:

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

推荐阅读