C++ 整数被设置为任意值

C++ 整数被设置为任意值,c++,directx,C++,Directx,在一个要读入.mtl文件的类中,我有一个整数值,它存储读入的材料的当前索引,在执行ifstream.getline()之后,该值被设置为一个非常大的数字。有人知道为什么会发生这种情况以及如何解决吗 std::ifstream inf(fileName); int mtlcount = -1; if(!inf) { std::cout << "File could not be opened"; return 1; } while(!inf.eof()) {

在一个要读入.mtl文件的类中,我有一个整数值,它存储读入的材料的当前索引,在执行ifstream.getline()之后,该值被设置为一个非常大的数字。有人知道为什么会发生这种情况以及如何解决吗

std::ifstream inf(fileName);
int mtlcount = -1;

if(!inf)
{
    std::cout << "File could not be opened";
    return 1;
}


while(!inf.eof())
{
    char line[40];
    inf.getline(line, 40);
//mtlcount set to a random value here
//more code
}
std::ifstream-inf(文件名);
int mtlcount=-1;
如果(!inf)
{

std::cout您可能需要阅读,因为您没有正确地使用它。这意味着您的代码有未定义的行为,这意味着您可能因此而有任何行为。

我们需要了解您从哪里开始使用
mtlcount
,不要使用
而(!inf.eof())
,它将不会像您期望的那样工作。原因是,
eofbit
标志在您从文件末尾以外的位置读取后才会设置。这意味着您的循环将从一次循环到多次循环。而不是循环到例如
while(inf.getline(…)
。至于您的问题,您如何确定
mtlcount
具有随机值?您发布的代码不会出现此问题。请发布我们可以重现问题的实际代码,或者无法回答此问题。@JoachimPileborg啊,谢谢,一旦我解决了此问题,我会考虑此问题。您能举个例子说明如何解决此问题吗我应该在这种情况下使用它?还是应该改用sscanf?关于如何使用sscanf有很好的例子
int Parser::readMtlFile(std::string fileName, std::vector<Material>* materials)
{
std::ifstream inf(fileName);
int mtlcount = -1;

if(!inf)
{
    std::cout << "File could not be opened";
    return 1;
}


while(!inf.eof())
{
    char line[40];
    inf.getline(line, 40);

    if(line[0] == 'n' && line[1] == 'e' && line[2] == 'w' && line[3] == 'm' && line[4] == 't' && line[5] == 'l')
    {
        mtlcount++;

        std::string mtlName;
        Material mtl;

        materials->push_back(mtl);

        int i = 7;
        while(line[i] != '\n' && i < 40)
        {
            mtlName += line[i];
            i++;
        }
        materials->at(mtlcount).name = mtlName;
    }

    if(line[0] == 'K' && line[1] == 'a')
    {
        float r, g, b;

        sscanf_s(line, "Ka %f %f %f", &r, &g, &b);

        materials->at(mtlcount).ambient = XMFLOAT4(r, g, b, 1.0);
    }

    if(line[0] == 'K' && line[1] == 'd')
    {
        float r, g, b;

        sscanf_s(line, "Kd %f %f %f", &r, &g, &b);

        materials->at(mtlcount).diffuse = XMFLOAT4(r, g, b, 1.0);
    }

    if(line[0] == 'K' && line[1] == 's')
    {
        float r, g, b;

        sscanf_s(line, "Ka %f %f %f", &r, &g, &b);

        materials->at(mtlcount).specular = XMFLOAT4(r, g, b, 1.0);
    }
}
}