Ich habe einen Eingabe-Iterator CSVIterator
wie in dieser SO answer definiert.Wie wird ein zurückgegebener Iterator in C++ korrekt inkrementiert?
In meinem Programm möchte ich nun einen solchen Iterator in einer Funktion zurückgeben und in meinem main()
verwenden. Der Iterator wird zurückgegeben und ich kann auf seinen Inhalt zugreifen. Aber wenn ich versuche, zu iterieren, stoße ich auf einen Segmentierungsfehler. Das Iterieren innerhalb der Rückgabefunktion funktioniert.
Ich habe zwei Fragen:
Warum ich in einen seg Fehler laufen? Ich dachte darüber nach, dass es sich um ein Problem des Umfangs handelt, aber sollte dann nicht schon der Zugriff auf den Inhalt des Iterators zu einem Segmentierungsfehler führen?
Wie kann mein Problem behoben werden? Die Idee besteht darin, die geöffneten Dateien bei der korrekten Iteration innerhalb einer größeren Schleife zu wechseln und immer am Anfang dieser bestimmten Datei zu beginnen. Ich komme von einem Python-Hintergrund und
yield
in einer Zeile der Datei nach dem anderen fühlt sich natürlich für mich, aber vielleicht ist es nicht in C++ empfohlen?
Hier ist der Code
// 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;
}
Das macht Sinn, danke! Die Datei innerhalb von 'main()' zu definieren, funktionierte jetzt. – Zollern