这是我的代码:
StockAccount::StockAccount() {
vector<string> temp;
string line;
std::ifstream stockfile("Results.txt");
if (stockfile.is_open()) {
while (stockfile.good()) {
getline(stockfile, line);
istringstream ss(line);
string token;
while (std::getline(ss, token, ',')) {
temp.push_back(token);
}
addStock(temp.at(0), temp.at(1), temp.at(2));
temp.clear();
}
stockfile.close();
} else {
cout << "Unable to open file" << std::endl << std::endl;
}
}
我知道这不是那么有效,这就是我想要解决的问题。应该做的是:
我使用vector vector来存储值,将它们添加到函数中然后清除它以便它可以为空并再次用于存储下一个......等等。
我尝试在temp.clear()之前打印出每个值,然后它们都打印出来然后我得到了错误。所以我知道temp.clear()就是问题所在。也许我使用的是错误的方法,或者有更好的方法。
我想尽可能尝试不使用提升。
这是我得到的错误:
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector
Results.txt是一个看起来像的文件。
goog,525,0 MSFT,34,10
等等。
答案 0 :(得分:5)
while (stockfile.good())
错了,导致您阅读一条额外的,不存在的行。
那是因为您在尝试读取新行之前检查了流的有效性;如果没有可以阅读的新行,那么只有在调用getline
之后这个条件会评估为false
,但到那时为时已太晚而你没有尝试处理这条不存在的行。
该不存在的行上没有三个标记,但您没有对标记化执行错误检查,也无法验证向量temp
的大小。
因此,当您尝试访问那些不存在的三个向量元素时,会抛出异常。
你的循环应如下所示:
while (getline(stockfile, line)) {
istringstream ss(line);
string token;
// ...
}
注意我如何在循环条件中直接检查是否成功,这将阻止在实际getline
失败时执行循环体。