读取时使用的C++无限循环。 我在C++中编写了一个光线跟踪程序。该程序的一部分应该能够从mesh.obj文件中读取三维模型

读取时使用的C++无限循环。 我在C++中编写了一个光线跟踪程序。该程序的一部分应该能够从mesh.obj文件中读取三维模型,c++,while-loop,infinite-loop,ifstream,.obj,C++,While Loop,Infinite Loop,Ifstream,.obj,我目前在使用std::ifstream读取文件时遇到问题 我编写了一个函数read_mesh,它接受一个字符串参数,指定用户给定的.obj文件的路径。该函数返回用于渲染网格的三角形基本体列表 我正在使用LOGINFO 这将设置流对象的内部状态,以便在I/O操作尝试设置这些位时引发异常 while (std::getline(obj, line)) 这表示在调用std::getline失败之前保持循环。通常,这是因为在读取最后一行之后调用std::getline时,对std::getline的调

我目前在使用std::ifstream读取文件时遇到问题

我编写了一个函数read_mesh,它接受一个字符串参数,指定用户给定的.obj文件的路径。该函数返回用于渲染网格的三角形基本体列表

我正在使用LOGINFO 这将设置流对象的内部状态,以便在I/O操作尝试设置这些位时引发异常

while (std::getline(obj, line))
这表示在调用std::getline失败之前保持循环。通常,这是因为在读取最后一行之后调用std::getline时,对std::getline的调用将失败

但在这种情况下,流被设置为在尝试输入失败时引发异常。因此循环不会正常终止,因为对std::getline的最后一次调用会引发异常


如果删除将流设置为抛出异常的行,那么事情将按照您期望的方式进行。

听起来是学习如何使用调试器的一个机会。否则,创建一个超级极小的.obj文件,该文件将复制该行为,并发布一个我们可以自己编译的.if!std::getlineobj,行{LOGINFO@falopsy:不需要它是对的,因为前一个循环似乎只在getline返回false时终止。但是,它不会读取超过行/文件的结尾;只在检查流的状态位后返回false。捕捉和处理ifstr引发的异常的代码在哪里eam?@AndyG•getline不会返回false,因为ifstream被设置为抛出异常。while循环将通过异常终止。感谢您指出并解释该错误!我删除了该行,示例现在可以运行了,但是在对实际函数进行更改后,程序卡在了obj.openpath行上,IO::I.路径可能有问题,还是我在这里捕获了错误的异常?除了在VisualStudio中编译/EHA选项、属性> >代码生成> >启用C++异常>是的,使用SEH异常除外,一些内存/文件异常不会自动抛出。您还可以在您之后设置catch STD::异常和catch…r ifstream异常,以防引发另一种异常类型。更好的编码方式是将您的异常捕获为常量引用,即catchconst std::exception&e{};
int main()
{

std::ifstream obj;

obj.exceptions(std::ifstream::failbit | std::ifstream::badbit);

try {
    // Enter the path to the example.obj file
    obj.open("C:/Users/Bram/Desktop/example-obj.txt", ios::in);
}
catch (std::ifstream::failure::exception e) {
    std::cout << "Failed to open file";
    return(1);
}

std::cout << "Reading file";

std::string line;

while (std::getline(obj, line))
{
    std::cout << "New line";

    std::istringstream iss(line);
    std::string method;

    iss >> method;

    if (method == "v")
    {
        double x, y, z;

        iss >> x >> y >> z;

        std::cout << "New vertex (" << x << ", " << y << ", " << z << ")";
    }

    else if (method == "f")
    {
        int a, b, c;
        char s;

        while ((iss >> a >> s >> b >> s >> c) && s == '/')
        {
            std::cout << "New triangle using vertices " << a << ", " << b << ", " << c;
        }
    }
    else
    {
        std::cout << "Ignored line";
    }
}

std::cout << "Finished reading file";

obj.close();

return(0);
}
# example.obj

v  -7.8541 121.3862 17.1093
v  7.1431 113.8654 23.1824
v  15.3955 112.2824 13.7628

f  1/2/3
Unhandled exception at 0x75EA08B2 in meshreader.exe: Microsoft C++ exception: std::ios_base::failure at memory location 0x008FF3F0.
obj.exceptions(std::ifstream::failbit | std::ifstream::badbit);
while (std::getline(obj, line))