得到一个out_of_range:c ++的向量错误,但无法找出原因

Zer*_*tas 1 c++ vector

这是我的代码:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我知道这不是那么有效,这就是我想要解决的问题.应该做的是:

  1. 逐行读取该文件.
  2. 解析每一行并用逗号分隔.
  3. 取这3个值并在方法中使用它.

我使用vector vector来存储值,将它们添加到函数中然后清除它以便它可以为空并再次用于存储下一个......等等.

我尝试在temp.clear()之前打印出每个值,然后打印出来然后我得到了错误.所以我知道temp.clear()就是问题所在.也许我使用的是错误的方法,或者有更好的方法.

我想尝试,如果可能的话不要使用提升.

这是我得到的错误:

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector
Run Code Online (Sandbox Code Playgroud)

Results.txt是一个看起来像的文件.

goog,525,0 msft,34,10

等等.

Lig*_*ica 5

while (stockfile.good()) 是错误的,导致你读一个额外的,不存在的行.

那是因为你尝试阅读新行之前检查了流的有效性; 如果没有新的线路可以读取,那么只有调用getline此条件后才能评估,false但到那时为止已经太晚了,而你正试图处理这条不存在的线路.

那个不存在的行上没有三个标记,但是你没有对标记化进行错误检查,也没有验证向量的大小temp.

因此,当您尝试访问那些不存在的三个向量元素时,会抛出异常.

你的循环应该如下所示:

while (getline(stockfile, line)) {
    istringstream ss(line);
    string token;
    // ...
}
Run Code Online (Sandbox Code Playgroud)

注意我如何直接检查循环条件是否成功,如果实际getline失败,将阻止循环体执行.