0

在线:std::ifstream fileOpen(file.c_str());在下面的函数中,程序崩溃并给我这个错误:

此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。


进程退出并返回值 3

但是,在调试模式下,整个程序都会运行,但是在我得到的 main 函数的 return 0 语句中

程序收到信号 SIGTRAP,跟踪/断点陷阱。

我在 Windows 7 上使用 Orwell Dev/C++。据我所知,第一个问题是抛出但未捕获的异常(我还没有自学异常,所以我不知道该怎么做,但我可以读取)并且它可能会破坏堆栈。后一个错误我无法获得太多具体信息。任何人都可以请我指出解决方案的方向吗?哦,还有,该函数在第四次崩溃之前被调用了三次。

//Get a line of data from a file
std::string getData( std::string file, int line )
{
    std::string data;
    std::ifstream fileOpen(file.c_str());

    if (fileOpen.is_open()) 
    {
        if( fileOpen.good() ) 
        {
            for( int lineno = 0; getline(fileOpen,data) && lineno < line; lineno ++ )
            {
                if( lineno != line )
                {
                    data = "";
                }
            }
        }

        fileOpen.close();
    }

    return data;
}

//Parse comma delimited string into a vector
void parseData( std::vector<double> &temp, std::string data ) 
{
    std::istringstream ss(data);
    std::string token;

    while(std::getline(ss, token, ',')) 
    {
        temp.push_back(atoi(token.c_str()));
    }
}

这些由如下代码调用:

std::string instData = getData( levelName+".dat", 2 );

if( instData != "" ) 
{
    parseData( temp, instData );
    instances.resize(temp.size() / 4);
    j = 0;

    for( int i = 0; i < temp.size(); i += 4 ) 
    {
        instances[ j ].type = temp[ i ];
        instances[ j ].xPos = temp[ i + 1 ];
        instances[ j ].yPos = temp[ i + 2 ];
        instances[ j ].zIndex = temp[ i + 3 ];
        j ++;
    }

    temp.clear();
}

此代码本身是函数的一部分,该函数旨在用指定文件中的数据填充各种向量。不过,其中的其余代码与上面的代码基本相同。

4

1 回答 1

1

I can clearly see a problem over here:

instances[ j ].xPos   = temp[ i + 1 ];
instances[ j ].yPos   = temp[ i + 2 ];
instances[ j ].zIndex = temp[ i + 3 ];

When i == temp.size() - 3, the last statement will access a memory region 1 past the end of the allocated memory for temp, causing Undefined Behavior. After that happens, your program has entered an invalid state.

Getting an error at the line at which you open the file may just be one of the effects of Undefined Behavior. As a test, remove the above three lines and see if any runtime errors occur.

于 2013-07-03T19:58:07.753 回答