在Visual C ++中读取.obj网格文件

时间:2012-03-19 21:55:48

标签: c++ visual-c++ opengl

我正在开发一个程序,它接收Wavefront .obj file并最终将其放入OpenGL并显示该对象。

现在我只是想读一个简单的cube.obj文件并打印内容。其内容是:

v -1.0 -1.0 -2.0 
v 1.0 -1.0 -2.0 
v 1.0 1.0 -2.0 
v -1.0 1.0 -2.0 
v -1.0 -1.0 -4.0 
v 1.0 -1.0 -4.0 
v 1.0 1.0 -4.0 
v -1.0 1.0 -4.0 
f 1 2 3 
f 3 4 1 
f 6 5 7 
f 5 8 7 
f 2 6 3 
f 7 3 6 
f 1 4 5 
f 4 8 5 
f 4 7 8 
f 4 3 7 
f 5 6 1 
f 6 2 1

我将cube.obj放在命令行args中并检查它是否打开。

FILE *fp;
fp = fopen(argv[1], "r");
if(fp == NULL)
    fprintf(stderr, "cat: can't open %s\n", argv[1]);
else
    printf("works");

cin.get();

它甚至没有打开。有没有更好的方法来打开.obj文件(以及最终打印它的内容?)

1 个答案:

答案 0 :(得分:0)

这里没有提供足够的信息,但很明显问题很可能是argv[1]的内容。 argv[1]处的指针指向什么?不要假设,使用调试器并查看它。我敢打赌,这不是你的想法。

您也没有考虑到您的程序可能没有使用任何参数启动的事实,这意味着argv[1]正在读取缓冲区的末尾。但这很切。

编辑:

根据您的评论,您需要将文件的完整路径提供给fopen。如果文件在您正在运行的目录中,它应该可以工作,但取决于你的environemnt(VS是一个)可能不像听起来那么简单。

我在\ project \ debug目录中运行了一个文件foo.txt的测试,该目录与我的可执行文件相同。它无法使用相对路径打开文件,但是以完整路径成功。

但是,如果我只是双击该目录中的可执行文件就可以了。显然VS正在幕后做一些改变工作目录的事情。

要使用相对路径,请右键单击项目 - >属性 - >调试 - >工作目录。将其设置为输出文件夹,你应该没问题。

#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>

int main() {
    FILE *file;
    if(!(file = fopen("foo.txt", "r"))) {
        printf("no worky");
    }
}