【问题标题】:Getting an out_of_range: vector error for c++ but can't figure out why得到一个 out_of_range:c++ 的向量错误,但不知道为什么
【发布时间】:2013-12-05 17:06:58
【问题描述】:

这是我的代码:

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

}

我知道它效率不高,这就是我要解决的问题。它应该做的是:

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

我正在使用该向量 temp 来存储值,将它们添加到函数中,然后将其清除,以便它可以为空并再次用于存储下一个值...等等。

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

如果可能,我想尝试不使用 boost。

这是我得到的错误:

libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector

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

goog,525,0 msft,34,10

等等。

【问题讨论】:

  • 您正在访问索引2 而不检查向量的大小。超出范围的错误并不令人惊讶。
  • 我知道每一行都会有 3 个元素。
  • 好的,那一定是编译器的bug。只是开玩笑。
  • 哈。我在 Mavericks 上使用 clang++ 和 C++11。
  • 如果您发布 Results.txt 的内容并附上可以让我们复制错误的代码,您将获得更好的回复。

标签: c++ vector


【解决方案1】:

while (stockfile.good()) 是错误的,会导致您多读一个不存在的行。

这是因为您在尝试读取新行之前检查流的有效性;如果没有要读取的新行,则只有在调用getline 之后,此条件才会评估为false,但到那时为时已晚,您将尝试处理此非-现有线路。

那条不存在的行上没有三个标记,但您没有对标记化执行错误检查,也没有验证向量 temp 的大小。

因此,当您尝试访问这三个不存在的向量元素时,会引发异常。

你的循环应该是这样的:

while (getline(stockfile, line)) {
    istringstream ss(line);
    string token;
    // ...
}

注意我是如何在循环条件中直接检查成功的,如果实际的getline 失败,这将阻止循环体被执行。

【讨论】:

  • 解决了!谢谢。我还进行了尺寸检查以确保(即使永远不会那样)。我看到你用你的解决方案做了什么。少一步,以更好(和工作)的方式处理我想做的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 2021-12-25
  • 1970-01-01
相关资源
最近更新 更多