【发布时间】:2016-07-09 00:57:35
【问题描述】:
我正在尝试为 Wavefront .OBJ 文件编写阅读器,以便可以在 OpenGL 中绘制网格。为此,我尝试积累一些基本的 C++ 文件 IO 知识,因为我主要了解 java。我从this questions answer 了解到>> 可用于从流中读取数据。
我读取我的 OBJ 文件的策略是首先读取标识下一个数据片段的字符,然后继续尝试读取数字,直到我不能再读取。然后我尝试阅读下一个字符。我的代码如下:
std::ifstream objReader;
objReader.open("resources//file.obj");
char m;
int vindex = 0;
int iindex = 0;
while (objReader >> m) {
std::cout << "here" << std::endl;
if (m == 'v') {
GLfloat cv;
while (objReader >> cv) {
objData[vindex] = cv; //obj data is my verticies array to be drawn
std::cout << objData[vindex] << std::endl;
vindex++;
}
}
else if (m == 'f') {
GLuint ci;
while (objReader >> ci) {
indicies[iindex] = ci; //indicies is my EBO array
std::cout << indicies[iindex] << std::endl;
iindex++;
}
}
}
我使用的文件数据可以在here找到。
现在,当我运行此代码时,它可以正常打开文件并成功读取第一行。它将标记识别为 char v 然后它将以下 3 个浮点数存储到我的数组中。问题是,它就这样结束了。循环中断,它甚至永远不会继续到第二行。不知何故,它再也找不到文件中的任何其他字符。为什么会发生这种情况,我该如何解决?
谢谢!
【问题讨论】:
-
这个 OBJ 文件是二进制文件(包含控制字符)吗?如果是这样 是否使用
ios::binary选项打开流? -
想想当您退出
while (objReader >> cv)或while (objReader >> ci)时流处于什么状态,或者只是阅读Sam Varshavchik 的答案。克罗姆那家伙必须打字快。 -
@PaulMcKenzie 我只是这样做:
objReader.open("resources//file.obj");。还编辑了打开问题正文的读者。 -
@user4581301 老实说对流的状态不太了解,不过我会查一下。
标签: c++ opengl file-io wavefront