ios::app



  • Hallo,

    ich habe kurz eine Frage zu ios::app. Mit diesem Befehl kann ich ja die Ausgabe an die Datei anhängen. Gint es irgendwie die Möglichkeit nicht die ganze Ausgabe immer hinten anzuhängen , sonder nur die letzten 10 oder so?

    Ich habe zum Beispiel folgendes:

    for (vector<SCIP_CONS*>::const_iterator iter = periodCon_.begin(); iter != periodCon_.end(); ++iter) {
                    double newgamma = SCIPgetDualsolLinear( scip, *iter );
                    dualVariables.gamma.push_back(newgamma);
    
             std::ofstream File2("Gamma.txt", ios::app);
    
                                  File2 << newgamma << endl;
    
                                  File2.close();
    
    }
    

    Ich möchte das die Datei am Ende nur die letzten 10 Werte enthält. Ist das irgendwie möglich?

    Danke!



  • Tugba schrieb:

    ich habe kurz eine Frage zu ios::app. Mit diesem Befehl [...]

    ios::app ist kein Befehl, sondern einfach ein Flag, das dem fstream beim Öffnen mitgegeben wird.

    kann ich ja die Ausgabe an die Datei anhängen. Gint es irgendwie die Möglichkeit nicht die ganze Ausgabe immer hinten anzuhängen , sonder nur die letzten 10 oder so?

    Jein. fstream bietet dazu keine Funktionalität an. Allerdings ist das auch garnicht nötig. Du darfst eben nicht alles aus dem vector in die Datei stopfen, sondern nur die letzen 10 Elemente.

    vector::size liefert dir die Anzahl der Elemente, außerdem kann man durch Addition und Subtraktion der Iteratoren mit Ganzzahlen neue Iteratoren erhalten, z.B. einen, der auf das zehntletzte Element zeigt. Das sollte als Anregung reichen, um dich auf die richtige Spur zu bringen 😉
    PS: Achte auf Spezialfälle, z.B. wenn der vector weniger als 10 Elemente enthält.
    PPS: Öffne die Datei vor der Schleife. Sie immer zu öffnen und zu schließen ist unnötig.



  • Ich würde auch davon absehen, die Datei für jeden Schleifendurchlauf neu zu öffnen und zu schließen und std::endl durch '\n' ersetzen (Flushen ist nicht nach jedem Wert notwendig und geht auf die Performance).



  • Hallo,

    danke für eure Hilfe, aber da ich noch überhaupt keine Ahnung von C++ habe und diesen Code bekommen habe, weiß ich garnicht wie ich ansätzen soll.

    Mit vector:size bekomme ich wie groß mein vector ist. Wie kriege ich denn die Iteratoren dazu an der zehnt letzten position im vector anzufangen und dann diese Werte in die datei zu schreiben??

    Danke!



  • Tugba schrieb:

    Wie kriege ich denn die Iteratoren dazu an der zehnt letzten position im vector anzufangen und dann diese Werte in die datei zu schreiben??

    1. it = begin() liefert dir, wie du vermutlich weißt, einen Iterator auf das erste Element.
    2. it += N verschiebt den Iterator um N Elemente.
    3. Als Abkürzung ginge auf it = begin() + N

    Quizfrage: wie viele Elemente musst du einen Iterator auf das erste Element verschieben, um einen Iterator auf das zehntletzte Element zu erhalten?

    Tugba schrieb:

    aber da ich noch überhaupt keine Ahnung von C++ habe und diesen Code bekommen habe, weiß ich garnicht wie ich ansätzen soll.

    Ganz ohne Ahnung wäre der beste Ansatz ein gutes C++-Einsteigerbuch. Da steht dann auch all sowas drin.



  • Es geht doch ganz einfach:

    std::copy(v.begin(), 
              (v.size() >= AnzahlElemente)? vector.begin() + AnzahlElemente : vector.end(), //Wenn der vector nicht genug Elemente hält, nur bis zum Ende (du kannst auch was werfen)
              std::ostream_iterator<SCIP_CONS*>(deinStream, "\n"));
    

    Ungetestet. SCIP_CONS* nehme ich an, ist der zu haltende Typ deines std::vector , v der Name deines std::vector und deinStream der Name deines Filestreams. Und der Delimitter (das Trennzeichen) ist ein Zeilenumbruch (wie gewünscht).

    Beachte aber, dass wenn du Zeiger in eine Datei schreibst, dir (!) diese später nichts bringen.



  • Hacker schrieb:

    Es geht doch ganz einfach:

    Ist es, aber in dem Fall hast du es dir ZU leicht gemacht, er kopiert nicht die Vectorelemente selber, sondern rechnet sich daraus einen Wert aus. Sieht man ja an seinem Code oben. Aber eigentlich sollte er jetzt auch selber dahinter kommen.



  • Dann könnte man transform + Lambdas statt copy nehmen. 😉 Aber ich glaube ohnehin nicht das das es zielführend ist, solche für einen Anfänger völlig unverständliche Codeschnipsel zu posten.


Anmelden zum Antworten