2016-05-25 6 views
1

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:

  1. 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?

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

Antwort

5

Ja, denn file ist ein lokaler Variable. Das bedeutet, dass Sie über etwas hinausgehen, was außerhalb des Gültigkeitsbereichs liegt (wenn die Funktion beendet wurde), was Undefined Behaviour provoziert, was den Absturz erklärt.


Beachten Sie, wie in der Antwort, die Sie verknüpft, file innerhalb main() deklariert wird.

+1

Das macht Sinn, danke! Die Datei innerhalb von 'main()' zu definieren, funktionierte jetzt. – Zollern