如何在C++中正确递增返回的迭代器



我有一个输入迭代器CSVIterator,如这个SO答案中所定义。

在我的程序中,我现在想在函数中返回这样的迭代器并在我的main()中使用它。迭代器被返回,我可以访问它的内容。但是在尝试迭代时,我遇到了分段错误。在返回函数中进行迭代是有效的。

我有两个问题:

  1. 为什么我会遇到赛格故障?我认为这是一个范围问题,但是对迭代器内容的访问不应该导致分段错误吗?

  2. 如何解决我的问题?这个想法是在正确的迭代中切换打开的文件,并始终从该特定文件的开头开始。我来自 Python 背景,yield一行又一行的文件对我来说感觉很自然,但也许不建议在C++中这样做?

这是代码

// For the definition of CSVIterator, see
// https://stackoverflow.com/a/1120224/2525159
CSVIterator fileIter(int time)
{
    std::string tstring = std::to_string(time);
    std::string ext = ".csv";
    std::ifstream file(tstring + ext);
    CSVIterator iter(file);
    // This would work:
    // ++iter;
    return iter;
}
int main()
{
    CSVIterator csvit;
    for (i=0; i<10000; i++) {
        if (i%20 == 0) {
            csvit = fileIter(i);
        }
        // I can access the iterator's contents
        // like (*csvit)[0] correctly.
        // However,iterating in here doesn't work.
        ++csvit; // seg fault here
    }
    return 0;
}
是的

,因为file是一个局部变量。这意味着您正在迭代超出范围的内容(当函数终止时),这会引起未定义的行为,这解释了崩溃。


请注意,在您链接的答案中,file是如何在main()中声明的。

相关内容

  • 没有找到相关文章

最新更新