seekp()



  • Ich weiß nicht wie ich die Funktion verwenden soll. Hab mir zwar --> http://cppreference.com/cppio/seekp.html angeschaut, bringt mich aber nicht sehr weiter. Mein Hauptproblem, nomalerweise gibt man doch einfach X\Y - Koordinate an? Aber bei "seekp()" kann man nur eine Zahl angeben, oder irgendwlechen komischen Typen "off_type offset, ios::seekdir origin" häää? Kann mirs jemand erklären wies funzt?
    MfG
    Stromberg

    EDIT: Frage bissel anderst, wie kann ich mit "seekp()" die Zeile wechseln?



  • seekp weiß gar nicht, was eine zeile ist. seekp verschiebt dir den dateipositionszeiger um einen bestimmten wert, ausgehend von entweder dem anfang der datei oder dem ende (oder der aktuellen position)

    stream.seekp (10, ios::beg); //zehn zeichen von beginn an
    

    seek arbeitet natürlich nur zeichenweise, nix mit zeilen. dazu siehe (D)Evils Post in deinem anderen Thread (zu ios::ate).



  • Wie mach ich das den mit dem "getline()"?
    Mach ich da einfach:

    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        ofstream file("H:/texxxt.txt", ios::out | ios::in);
        getline(file);
        file << "----";
        cout << file.tellp() << "\n";
    
    	return 0;
    }
    

    Des funzt bei mir net, ääh..mir fällt grad au auf, "getline(..)" benutzt man ja au eher zum auslesen oda?
    Wie mach ich das dann jetzt?
    Und wie mach ichs mit "getline(...)" beim auslesen?

    MfG
    Stromberg



  • Was willst du denn eigentlich erreichen?



  • Das der Schreibzeiger in eine andere Zeile rutscht?
    MfG
    Stromberg



  • und dann?
    Du kannst doch in eine bestehende Datei nichts einfügen, höchstens Daten überschreiben. Das was du willst dürfte einfacher zu erreichen sein, indem du die gesamte Datei einliest dann im eingelesenen String änderst und dann alles wieder abspeicherst.



  • Also ist es gar nicht möglich in "ofstreams" den Schreibzeiger Zeilenweise zu verändern?
    Schätzungsweise, ich hab eine Datei, die 100 Zeilen enthält. Und in Zeile 51 möchte ich "TEST TEST # TEST TEST # TEST TEST # TEST TEST" schreiben, so da wärs doch sinnvoller, wenn ich z.B. Zeile 51-100 in einen string vector reinhaue, den Satz in die Datei schreibe, und jetzt die 49 Zeilen im vector in die Datei schreibe? Da hab ich mir doch Arbeit = Zeit erspart?

    Kann mir den niemand sagen wie ich die Schreibzeiger Zeile verutsche? Gehts bei "ofstreams" nicht? Geht es dann wnigstens bei "ifstreams"?

    MfG
    Stromberg



  • Filepointer kennen keine Zeilen. Du kannst hier nur um diverse Anzahlen von Bytes verschieben. Wenn du also weißt wie lang jede einzelne Zeile ist kannst du dir die richtige Position ausrechnen.
    Wie schon gesagt, die ganze Datei einlesen, ändern, und dann alles wieder rausschreiben. das sollte am einfachsten sein, wenn die datein nicht zu groß sind.



  • Was bringt mir dann eigentlich "seekp()"? Das ich in einer Zeile den Schreibzeiger hin und herschiebe?

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-203869-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    (D)Evil schrieb:

    Naja ist das Problem. Dein OS und C++ sieht Dateien nicht Zeilenweise sondern Zeichenweise. Du kannst halt dir nen Template skip_lines machen (s. Werner Salomon) oder einfach direkt, indem du std::getline 3 mal aufrufst (for-Schleife?!). Normal schiebt man Dateizeiger per seekg/seekp aber das bringt dir dabei nicht soviel

    Was meint er damit genau?

    MfG
    Stromberg



  • Stromberg schrieb:

    Was bringt mir dann eigentlich "seekp()"? Das ich in einer Zeile den Schreibzeiger hin und herschiebe?

    Es gibt aus Sicht eines fstream keine Zeilen. seekp bringt Dir, dass Du den Lesezeiger auf eine beliebige Position innerhalb der Datei setzen kannst.

    Stromberg schrieb:

    (D)Evil schrieb:

    Naja ist das Problem. Dein OS und C++ sieht Dateien nicht Zeilenweise sondern Zeichenweise. Du kannst halt dir nen Template skip_lines machen (s. Werner Salomon) oder einfach direkt, indem du std::getline 3 mal aufrufst (for-Schleife?!). Normal schiebt man Dateizeiger per seekg/seekp aber das bringt dir dabei nicht soviel

    Was meint er damit genau?

    Wenn Du in der Datei die 12. Zeile erreichen willst, dann kannst Du das nur erreichen, indem Du die Datei durchliest, nach Zeilenende-Zeichen ('\n') suchst, und die ersten 11 davon ignorierst. Nichts anderes wird erreicht, wenn Du 11 mal getline aufrufst. Danach steht der Lesezeiger am Anfang der 12. Zeile. seekp bringt Dir hier garnichts.



  • Braunstein:

    ....diverse Anzahlen von Bytes verschieben...

    Wie mach ich das?
    MfG
    Stromberg


Anmelden zum Antworten