c++ - 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+ 时。
我在文本编辑器中检查了文件中是否有不可打印的符号,但这部分中没有任何符号。
每次我开始调试这段代码时,它都会做同样的事情——相同的字符串会在相同的符号处停止读取。为什么会发生?
解决方案
显然 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();
}
推荐阅读
- ios - Xcode 9 布局:有没有办法为 iPad 构建一个与 iPhone 相同内容的新故事板?
- c++ - C++ 将 wwn 字符串转换为识别为十六进制的数据类型
- c# - Xamarin 上的 ListView 中的空间过多
- kubernetes - 在 Kubernetes 节点上重启后删除 iptables 规则
- c# - EF 如何在一个请求中提出
- angular - 如何在打字稿中将base64 dataUrl转换为图像
- rest - REST URL 命名约定 /users/{id}/cars/{carId} 与 /cars/{carId}?
- hadoop - 你如何检查dfs中的目录
- c# - 查找具有不同名称的相同函数签名
- mysql - mySQL 从主键中选择和从外键中选择 big O