我对 C++ 和一般编码相当陌生,我正在使用 Visual Studio 2013 Desktop 编写一个简单的程序来收集 .CSV 文件中的数据并对其执行一些操作。该程序似乎编译和运行良好,并要求我输入要打开的文件的名称。就像我打算的那样,如果我输入一个无效的文件名,程序将显示一条错误消息并终止,但是如果我输入正确的名称,我会收到一条消息,上面写着
“TestIO.exe 中 0x0F16A9E8 (msvcr120d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xCCCCCCC0。”
带有中断或继续选项。如果我按继续,它会再次显示相同的消息,并无限继续,直到我按“中断”并停止调试。我完全不知道这里发生了什么,有人可以对此有所了解吗?将不胜感激。
编辑:这是我的主要()。希望这有助于更多,抱歉之前没有包括它。
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() 之外,我还确保更改所有函数定义/声明中的参数。我仍然收到与我最初遇到的相同的未处理异常错误。这是新的代码片段:
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();