我有一个输入迭代器 CSVIterator
在此 SO answer 中定义.
在我的程序中,我现在想在函数中返回这样一个迭代器,并在我的 main()
中使用它。返回迭代器,我可以访问它的内容。但是在尝试迭代时,我遇到了段错误。在返回函数内迭代有效。
我有两个问题:
为什么我会遇到段错误?我认为这是一个范围问题,但对迭代器内容的访问不应该导致段错误吗?
如何解决我的问题?这个想法是在正确的迭代中在更大的循环中切换打开的文件,并始终从该特定文件的开头开始。我有 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()
中声明的。
关于c++ - 如何在 C++ 中正确递增返回的迭代器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37433183/