Hilfe bitte... ganze textblöcke(zeilen) in einer txt-datei verschieben....



  • Hallo,

    auch nach langer Suche im forum hab ich leider noch keinen annähernden lösungsansatz gefunden und ich schaff das alleine irgendwie nicht.
    hat jemand eine funktion, um ganze text-blöcke in einer txt-datei an eine bestimmte stelle nach oben zu verschieben?

    mal ein beispiel, wie's in meiner txt-datei aussieht:

    von: text@blalbalba
    zeile 1
    zeile 2
    zeile 3
    zeile 4
    zeile 5
    zeile 6
    zeile 7
    bezug1####################
    ölaskdöjflkadsöflkasdfökasjdf
    ölaksdfölaskdöflkajsdölkfajsödlfj
    ölaksdfölaksdfölk
    bezug2####################
    blablalba
    zeile irgendwas
    und
    so weiter

    von: text@blalbalba222
    zeile 1
    zeile 2
    zeile 3
    zeile 4
    bezug1####################
    sssdddddddddddddd3eeeeeeeeeeeee
    opiu0o09898709870987
    lkjölkjölkölkj
    32132321323232321
    bezug2####################
    blablalba
    zeile irgendwas
    und
    so weiter

    nun soll es so aussehen, dass die zeilen zwischen bezug1 und bezug2 nach oben verschoben wird in die zeile direkt nach von:

    also soll die textdatei so aussehen (anhand des obigen beispiels):

    von: text@blalbalba
    ölaskdöjflkadsöflkasdfökasjdf
    ölaksdfölaskdöflkajsdölkfajsödlfj
    ölaksdfölaksdfölk
    zeile 1
    zeile 2
    zeile 3
    zeile 4
    zeile 5
    zeile 6
    zeile 7
    bezug1####################
    bezug2####################
    blablalba
    zeile irgendwas
    und
    so weiter

    von: text@blalbalba222
    sssdddddddddddddd3eeeeeeeeeeeee
    opiu0o09898709870987
    lkjölkjölkölkj
    32132321323232321
    zeile 1
    zeile 2
    zeile 3
    zeile 4
    bezug1####################
    bezug2####################
    blablalba
    zeile irgendwas
    und
    so weiter

    alles was ich hab, sind 3 konstante (von: , bezug1, bezug2) mit denen ich arbeiten kann - die zeile würde ich ja über strncmp noch finden, doch
    wie mache ich dann weiter???
    wenn ich zeilenweise einlese, bin ich ja bereits viel zu weit unten, um dann oben die zeile einzufügen zu können.
    Wie könnte die lösung aussehen??
    gibt es hierfür vielleicht funktionen?

    meine idee war zuerst, irgendwie die komplette datei in den speicher zu laden - allerdings könnte die u.Umständen auch gerne mal 20 MB groß sein was sicher zu Speicherproblemen führen könnte.

    bitte bitte helft mir schnell - bin mir sicher, für euch profis ist das ein Leichtes.

    gruß



  • Du musst die Datei in den Speicher lesen. Anders geht es nicht. Du liest zeilenweise ein und speicherst jede Zeile in einem Array. Dann sortierts du das Array so wie du es brauchst und speicherst es wieder in Datei.



  • 😕 😕 😕

    ich bekomms einfach alleine nicht hin - vielleicht hilft mir jemand.
    soweit bin ich schon - nun wie schiebe ich aber die zeilen nach oben??

    bitte hilfe.

    {
    	char* eingabedatei = "eingabe.txt";
        char* ausgabedatei = "eingabe2.txt";
    
    	char* schiebevon = "Bezug1######:"; // zwischen dieser zeile
      	char* schiebebis    = "Bezug2####";    // und dieser zeile
             char* nachzeile    = "Von: ";         // eine zeile NACH dieser zeile einfügen
    
        FILE* rein;
        FILE* raus;
        char buffer[5000]; 
        size_t len;
        char* p1;
        char* p2;
    
        /* Dateien öffnen */
        rein = fopen(eingabedatei, "r");
        if (rein==NULL) {
            fprintf(stderr, "Kann %s nicht lesen.\n", eingabedatei);
            return 1;
        }
        raus = fopen(ausgabedatei, "w");
        if (raus==NULL) {
            fclose(rein);
            fprintf(stderr, "Kann %s nicht schreiben.\n", ausgabedatei);
            return 2;
        }
    
        /* Lesen + verschieben + im speicher um-schreiben */
          while(fgets(buffer, sizeof(buffer), rein)) 
                {
            p1 = buffer;
           // while ((p2=strstr(p1, schiebevon))!=NULL)
              if((p2=strstr(p1, schiebevon))!=NULL) // if ist wohl besser, oder?
            {
               //
               //    H I L F E E E E
               // 
    
            }
               }
    
        fclose(raus);
        fclose(rein);
    	system("copy c:\\eingabe2.txt c:\\eingabe.txt");
    	system("del  c:\\eingabe2.txt");
    


  • @Horst2:
    bist du noch da??



  • 1. Um Dateien zu löschen, sollte man am besten remove() verwenden

    2. Zum Verschieben:

    Hier solltest du erstmal den Teil, den du verschieben möchtest in einen zweiten Puffer speichern. Dann musst du den Teil verschieben, der zwischen dem auszuschneidenden Teil und dem einzufügendem Teil liegen, also:

    zeile 1 
    zeile 2 
    zeile 3 
    zeile 4 
    zeile 5 
    zeile 6 
    zeile 7 
    bezug1####################
    

    Und zwar so, dass nach Von: ... genügend frei ist für den Teil, den du eigentlich verschieben willst. Danach brauchst du diesen Teil, der in deinem zweiten Buffer liegt nur noch an die freie Stelle kopieren.



  • hi,
    hmmm - und wie sieht sowas im c-code aus?
    kannst mir da bitte weiterhelfen - bin ein bloody-rooky und so hochkomplexe sachen hab ich noch nie gemacht....
    wär dir wirklich sehr dankbar.

    gruß
    werner



  • Hoch komplex ist das noch nicht, aber am Anfang ist es sicher schwer :).

    Versuch es erstmal hinzubekommen, dass du z. B. aus einem Satz ein bestimmtes Wort rausholst.

    Du hast also z. B. den Satz:
    "Das hier wird nicht funktionieren" (=> char satz[256];)
    Aus diesem sollst du jetzt "nicht" löschen und in einer extrigen Variable (char wort[8];) speichern.
    Am Schluss soll in satz "Das hier wird funktionieren" stehen und in wort "nicht".



  • jaja - für nen anfänger ists wirklich sehr schwierig - ich muss
    mich halt noch sehr viel durch "beispiele" durchhangeln, wenn dann mal der
    groschen gefallen ist, ists für mich auch viel leichter zu kapieren.

    vor allem, bin ich mir sicher, dass du schon die lösung für mein verschiebe-problemchen fertig im kopf hast.... (was ich auch gern hätte *g* bestechen lässt du dich ja wahrscheinlich leider nicht, oder? *g*)

    hab da mal ein ähnliches beispiel gefunden, nun aber das problem dass ich glaube ich hier strtok nicht anwenden sollte (oder es auch einfach nur falsch verstanden habe)
    mir sind halt leider auch noch nicht alle funktionen bekannt, die es so gibt - hab mir auch strncmp angeschaut, bin aber dann mit dem ersetzen nicht klar gekommen.
    selbst wenn das jetzt funktionieren würde, hätte ich ja immer noch das problem, dass es ganze zeilen-blöcke zu verschieben gibt (und nicht nur einzelne wörter in einer zeile (bzw. string)

    also hier mein lösungs"-ansatz" zu deiner aufgabe........

    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <conio.h>
    
    int main()
    { 
        char satz[256]="Das hier wird nicht funktionieren"; 
        char satzneu[256]; 
      char wort[8]="nicht"; 
        char *hilfe; 
    
    // strtok
    
        *satzneu=0; 
        printf( "%s\n",satz); 
        strcat(satzneu,hilfe = strtok(satz, wort )); 
        while( hilfe = strtok(NULL, wort )) 
    
            strcat(satzneu, hilfe); 
        printf("%s\n", satzneu); 
    }
    



Anmelden zum Antworten