简单应用程序中未处理的异常

时间:2014-05-25 23:50:43

标签: c++ runtime unhandled-exception first-chance-exception

我对C ++和编码很新,我正在使用Visual Studio 2013 Desktop编写一个简单的程序来收集和执行一些来自.CSV文件的数据操作。该程序似乎编译并运行正常,并要求我键入要打开的文件的名称。就像我打算的那样,如果我键入一个无效的文件名,程序将显示一条错误消息并终止,但如果我输入正确的名称,我会收到一条消息说

“TestIO.exe中0x0F16A9E8(msvcr120d.dll)处的未处理异常:0xC0000005:访问冲突读取位置0xCCCCCCC0。”

使用Break或Continue选项。如果我按下继续,它会再次显示相同的消息,并继续无限直到我按下“中断”并停止调试。我完全不知道这里发生了什么,有人可以对此有所了解吗?非常感谢。

编辑:这是我的主要()。希望这会有所帮助,抱歉以前不包括它。

int main()
{
    int numDays = 0, streams;
    string* date;
    string line, filename;
    DailyData* days;
    cout << "Enter file name: ";
    getline(cin, filename);
    ifstream infile;
    infile.open(filename); 
    if (infile.fail())
    {
        cout << "Error opening input file" << endl;
        return 0;
    }
    while (getline(infile, line))
        numDays++;
    date = new string[numDays];
    for (int i = 0; i < numDays; i++)
        getline(infile, date[i]);
    days = new DailyData[numDays];
    for (int i = 0; i < numDays; i++)
    {
        getData(date[i], streams);
        days[i] = DailyData(date[i], streams);
    }
    cout << "Max Streams: " << maxStreams(days, numDays) << endl;
    cout << "Min Streams: " << minStreams(days, numDays) << endl;
    cout << "Avg Streams: " << average(days, numDays) << endl;
    cout << "Tot Streams: " << total(days, numDays) << endl;
    delete[] days;
    delete[] date;
    infile.close();
    return 0;
}

编辑2:以下是你们要求的一些内容

void getData(string& d, int& s)
{
    int start = 0, end = 0, i = 0;
    string p[14];
    while (start != string::npos)
    {
        end = d.find(",", start); 
        p[i] = d.substr(start, end - start);
        start = end + 1;
        i++;
    }
    d = p[0];
    s = atoi(p[5].c_str());
}

这里是DailyData和它的构造函数

class DailyData
{
    public:
    DailyData() :date("NULL"), streams(0){}
    DailyData(string d, int s) :date(d), streams(s){}
    string getDate(){ return date; }
    int getStreams(){ return streams; }
    friend ostream& operator << (ostream&, DailyData&);
    private:
        string date;
        int streams;
};

编辑3:我将代码更改为使用向量而不是数组。随着更改int main(),我确保更改所有函数定义/声明中的参数。我仍然得到我原来得到的同样的Unhandled Exception错误。这是新的代码段:

vector<string> date;
vector<DailyData> days;

//...

while (getline(infile, line))
{
    date.push_back(line);
    getData(date.back(), streams);
    days.push_back(DailyData(date.back(), streams));
}
numDays = days.size();

1 个答案:

答案 0 :(得分:2)

在您已经读取到文件末尾之后,您的代码似乎在输入文件上调用了getline

while (getline(infile, line))
    numDays++;

// above reads every line in the file,
// then you call this, even though while(getline) has returned false:

for (int i = 0; i < numDays; i++)
    getline(infile, date[i]);

如果您是编程新手,请始终使用花括号来显示循环体,以便您可以看到循环块执行的开始和结束位置。

另外,在实践中,最好学会使用调试器。这将是您作为程序员所做过的最有价值的事情。

修改

这里是你如何使用动态可调整大小的向量而不是固定大小的数组:

std::vector<string> dates;

//...

while( getline(infile, line) )
{
    dates.push_back(line);
}

如果您需要更多信息,请搜索C ++ vector。

<强> EDIT2:

既然已经发布了getData的代码,我认为问题就在那里。首先,这段代码:

while (start != string::npos)
{
    end = d.find(",", start); 
    p[i] = d.substr(start, end - start);
    start = end + 1;
    i++;
}

看起来非常危险。

p[i] = d.substr(start, end - start); 
如果end == string :: npos,只要d.find找不到逗号,

将导致奇怪的行为。

同样,如果结束= = string :: npos

,则start = end + 1将执行您所期望的操作

进一步p [i] = ...仅适用于小于13的i值。我看不到任何检查来保证这一点。

我的第一个建议是检查end == string :: npos,如果不是则执行其他操作。

希望有所帮助,此代码的行为在很大程度上取决于您的输入数据的外观,这就是为什么最好使用调试器。