【问题标题】:ifstream fileOpen causes program to 'terminate in an unusual way'ifstream fileOpen 导致程序“以不寻常的方式终止”
【发布时间】:2013-07-03 19:32:17
【问题描述】:

在以下行: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();
}

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

【问题讨论】:

  • if (lineo != line) 语句是多余的,因为只有当lineno 小于 小于line 时循环才会运行,这意味着它始终为真。
  • 你是对的。删除它并将lineno &lt; line 更改为
  • 这是与问题相关的整个代码吗?你到底在用data做什么,你是如何/在哪里调用这个函数的?
  • 该文件有一堆用逗号分隔的整数。 data 被发送到另一个函数,该函数将它们放入向量中。
  • 那么这段代码没有显示任何可能导致运行时错误的内容,你能告诉我们你描述的代码吗?

标签: c++


【解决方案1】:

我可以清楚地看到这里有问题:

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

i == temp.size() - 3 时,最后一条语句将访问为temp 分配的内存末尾之后的内存区域1,从而导致Undefined Behavior。发生这种情况后,您的程序就进入了无效状态。

在打开文件的那一行出现错误可能只是未定义行为的影响之一。作为测试,把上面三行去掉,看看有没有运行时错误。

【讨论】:

  • 当然是面包屑。谢谢。我仍然习惯于处理记忆。
  • @goldfinch 没问题,很高兴我能帮上忙!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 2015-05-02
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-28
相关资源
最近更新 更多