Zeilen an den Anfang der Datei anfügen



  • Hallo 🙂

    Ich suche eine Möglichkeit einen Text an den Anfang einer Datei "anzuhängen".
    Also so.

    Vorher:

    wie gehts
    

    Nachher:

    [b]Hallo[/b] wie gehts
    

    Kann mir einer sagen wie das geht?



  • Lies die ganze Datei in einen Puffer ein, mach deine Änderungen, und schreib sie dann wieder.



  • Neue Datei öffnen, den Neuen Text reinschreiben.
    Alte Datei öffnen und den Inhalt in die neue Datei kopieren.
    Beide Dateien schließen.
    Alte Datei löschen und neue Datei in alte Datei umbennennen.



  • Gibts da keine andere Möglichkeit?
    Die Dateien sind oft über 20MB groß und das würde dann warscheinlich ewig dauern..


  • Mod

    Dateiliebhaber schrieb:

    Gibts da keine andere Möglichkeit?

    Nein. Das ist auch keine Einschränkung von C, sondern eine Einschränkung die dadurch gegeben ist, was eine Datei in üblichen Dateisystemen überhaupt ist. Die Frage ist: Warum muss ausgerechnet vorne angefügt werden?

    Die Dateien sind oft über 20MB groß und das würde dann warscheinlich ewig dauern..

    Au weia, 20 MB. Das dauert bestimmt 0.02 Sekunden. Da musst du dir wohl etwas anderes überlegen, das ist nicht akzeptabel.



  • ewig? bei der geschwindigkeit heutiger rechner dürfte es lediglich ein augenzwinkern lang dauern.

    wenn du schon im voraus weißt, wie groß die datenmenge ist, die an den anfang geschrieben werden soll, kannst du auch eine entsprechend große datei im voraus vorbereiten.



  • Hm ok ich dachte das würde länger dauern.
    Hab ca 5GB mit Dateien zwischen 1 und 66MB.

    Es muss auch nicht unbedingt an den Anfang sein aber es muss relativ weit oben hin also nicht ans Ende. Sonst wäre es ja kein Problem 😉

    na gut ich probiere es mal so kann ja berichten wie es geklappt hat. 😃


  • Mod

    Dateiliebhaber schrieb:

    Es muss auch nicht unbedingt an den Anfang sein aber es muss relativ weit oben hin also nicht ans Ende. Sonst wäre es ja kein Problem 😉

    Naja, alles was nicht am Ende ist, hat das gleiche Problem. Da hilft auch nix dagegen.

    Hab ca 5GB mit Dateien zwischen 1 und 66MB.
    

    Ok, im ganzen reicht es da dann nicht, einen Kaffee zu trinken bis das Programm fertig ist. Da wird schon eine Mittagspause oder bei sehr lahmen Systemen sogar der Feierabend über Nacht nötig sein, bis 5 GB hin und her kopiert wurden. Muss das öfters gemacht werden oder ist das eine einmalig Aktion. Wenn das öfters gemacht werden soll, dann musst du dir vielleicht mal ein intelligenteres System ausdenken, wie man die neuen Daten auch hinten anhängen kann.

    P.S.: Überschreiben von Daten (auch mittendrin!) ist übrigens kein Problem, bloß Einfügen!



  • SeppJ schrieb:

    Au weia, 20 MB. Das dauert bestimmt 0.02 Sekunden. Da musst du dir wohl etwas anderes überlegen, das ist nicht akzeptabel.

    Das sind 1000 MByte/s

    SeppJ schrieb:

    Dateiliebhaber schrieb:

    Hab ca 5GB mit Dateien zwischen 1 und 66MB.
    

    Ok, im ganzen reicht es da dann nicht, einen Kaffee zu trinken bis das Programm fertig ist. Da wird schon eine Mittagspause oder bei sehr lahmen Systemen sogar der Feierabend über Nacht nötig sein, bis 5 GB hin und her kopiert wurden.

    Bei 1 Stunde sind das ca 1.4 MByte/s

    Na ja, irgendwo dazwischen liegt die Wahrheit 🙂

    Aktuelle Platte schaffen je nach Anbindung so Pi mal Daumen 100 MB/s.

    Bei gleichzeitigem lesen und schreiben wird das dann weniger.
    Mit fopen und fclose und dgl. schätzen wir mal 10 MB/s, macht bei 5000 MB dann doch 500 s (etwas über 8 Minuten)



  • Du brauchst keine 2. Datei

    int main()
    {
      static char p[1000],puffer[67000000]="1.Zeile\n2.Zeile\n";
      size_t x;
      FILE *f=fopen("datei.txt","r+");
    
      while( x=fread(p,1,1000,f) ) strncat(puffer,p,x);
    
      rewind(f);
      fputs(puffer,f);
      fclose(f);
    
      return 0;
    }
    

    Funktioniert nur mit Textdateien, d.h. Dateien ohne '\0', und für ausreichend Speicher (statisch od. dynamisch) musst du auch noch sorgen.
    Problematischer wird es, wenn du Dateien "verkleinern" willst, das geht dann nicht mehr standardkonform.


Anmelden zum Antworten