Einen Teiltext in eine andere Datei schreiben



  • Hi,

    folgendes:

    Ich hab eine Textdatei in der steht:

    blablabla {Feld 01} bla {blla]}

    wie sieht jetzt der Quellcode aus, wenn ich will, dass nur der Ausdruck "{Feld 01}" in eine andere Textdatei geschrieben wird?

    Das is meine Vorgabe:

    #include <stdio.h>

    #include <io.h>

    #include "L01.h"

    //------------------------------------------------------------------------------
    int L01_RedFil(char* FilNam)
    {
    FILE *d1 = fopen(FilNam,"r");
    FILE *d2 = fopen("output.txt","w");

    int c;

    while((c=fgetc(d1))!=EOF)
    {
    if(c != '{') continue;

    //------------------------------------------------------------------------------

    Danke schonmal im voraus.

    Gruß
    Chris



  • Ich würde die Eingabedatei per getline() zeilenweise einlesen, dann den Mittelteil per string::find() suchen und per string::substr() ausschneiden und in die Zieldatei schreiben.



  • Aber dann macht das Programm keinen Sinn oder? Kann ich net einfach sagen von { bis } ausschneiden und in output.txt reinschreiben? Mein Ausbilder meinte das wär n 2 Zeiler.

    Ich habs mal so probiert:

    if(c != '{') continue;

    else (c=fprintf(d2,"%c"))

    Allerding sucht er mir dann nur die Buchstaben aus dem Text, die ich in der if-Anweisung aussuche und schreibt sie in die .txt.

    Gruß Chris



  • Etwas aufwendiger als das ist es vermutlich schon - du mußt anhand der Trennzeichen umschalten zwischen "schreiben" und "nicht schreiben":

    bool write=false;
    
    while((c=fgetc(d1))!=EOF)
    {
      if(c=='{')//Beginn des Blocks
        write=true;
      if(c=='}')//Ende des Blocks
      {
        write=false;
        fputc(d2,c);
      }
      if(write) fputc(d2,c);
    }
    

    (PS: Wir sind hier im C**++** Board, da solltest du lieber fstreams verwenden anstelle von FILE*)



  • Ah danke, hat funktioniert.

    Mein Ausbilder hats so gelöst:

    int L01_RedFil(char* FilNam)
    {
    FILE *d1 = fopen(FilNam,"r");
    FILE *d2 = fopen("output.txt","w");

    int c,Flag,d;

    Flag=0;
    while((c=fgetc(d1))!=EOF)
    {
    if(c=='{') { Flag = 1; continue; }
    if(c=='}') { Flag = 0; fprintf(d2,"\n"); }

    if(Flag) fprintf(d2,"%c",c);
    }

    fclose(d1);
    fclose(d2);

    return(0);
    }

    Eine Frage: Jetzt im Moment schreibt er 2 Zeilen in die Output.txt, jetzt will er noch, dass das nummeriert wird. Also 1., 2. usw... Wie stell ich das an? Mach ich das mit: enum TNumberingStyle (nsBullet);?



  • Du kannst dir einen Zähler mitführen und dann setzt du vor das continue; ein fprintf(d2,"%d. ",++zeile); .



  • funktioniert wunderbar danke nur leider zählt er so:



  • Du solltest den Zähler eventuell auch mit einem vernünftigen Wert initialisieren 😉



  • wie mach ich das?

    Hab oben d=1 gemacht, aber ändert sich nix.

    <--- anfänger at work 😃



  • Normalerweise, indem du direkt bei der Variablen-Deklaration einen Startwert angibst (ala int zeile=0; ).

    Achja: Was ist nun wieder d?

    PS: sfds (nur für die Zukunft)



  • hätt ich auch selber drauf kommen können. 🙂

    was ich als nächstes machen muss is die einzelnen Punkte einklammern.

    Soll so aussehen:

    01. <Feld 01>
    .
    .
    .

    Ich hab bisher nur geschafft dass das so aussieht:

    0<1<.< <f<e<l<d< <0<1<



  • Dazu packst du die Ausgabe der öffnenden Klammer mit in den if(c=='{') Block und der schließenden Klammer in den if(c=='}') Block.

    PS: Kannst du mal die komplette Aufgabe zusammenfassen? Diese ständigen "als nächstes"-Ergänzungen ziehen den Thread imho nur unnötig in die Länge 😉



  • das Problem is, ich weiß selber nich was als nächstes kommt. Denn zu mir heißst es auch "Als nächstes..." 😃



  • Jetzt bin ich bei chars angelangt 😃

    int L01_RedFil(char* FilNam)
    {
    char s1[100];
    char s2[100];
    
    FILE *d1 = fopen(FilNam,"r");
    FILE *d2 = fopen("output.txt", "w");
    
    sprintf(s1,"Test1");
    sprintf(s2,"Test1");
    
    Etc_RedStr(d1,s1,'{','}',50);
    Etc_RedStr(d1,s2,'{','}',50);
    
    fprintf(d2,"s1 nach etc: %s\n",s1);
    fprintf(d2,"s2 nach etc: %s\n",s2);
    
    fclose(d1);
    fclose(d2);
    
    return(0);
    }
    //------------------------------------------------------------------------------
    
    //------------------------------------------------------------------------------
    int Etc_RedStr(FILE* d,char* s,char ka,char kz,int nMax)
    {
    
    int c,nc=0;
    
    while((c=fgetc(d1))!=ka) if(c==EOF) return(-1);
    
    while((c=fgetc(d1))!=kz)
      {
      if(c==EOF) return(-1);
    
      s[nc++] = c;
    
      }
    
    return(c);
    }
    

    Ich will den String in Klammer (befindet sich wieder in der 1. Datei, genannt input.txt) einzeln auslesen und dann die char zählen und mir ausgeben lassen.



  • Also hab ich hier keine Hilfe mehr zu erwarten?? 😞

    Bye!



  • Was genau willst du denn zählen? Die Länge eines gegebenen Strings (Anzahl der enthaltenen char's) kann dir die Funktion strlen() liefern.

    PS: Wenn du schon eine Maximalgröße an deine Funktion übergibst, solltest du auch sicherstellen, daß du sie nicht überschreitest. Und vor der Rückgabe des Strings solltest du ein '\0' hinten dranhängen:

    int Etc_RedStr(FILE* d,char* s,char ka,char kz,int nMax)
    {
      int c,nc=0;
    
      while((c=fgetc(d1))!=ka) if(c==EOF) return(-1);
      while((c=fgetc(d1))!=kz)
      {
        if(c==EOF) return(-1);
    
        s[nc++] = c;
        if(nc>=nMax-1) break;//Sicherheitsüberprüfung - reicht der Platz?
      }
      s[nc]='\0';//Null-Terminator anhängen
    
      return nc; //Es ist vielleicht günstiger, die Anzahl der gelesenen Zeichen zurückzugeben, dann erübrigt sich die Zählung
    }
    


  • die Null is für?



  • Chris236 schrieb:

    die Null is für?

    die weitere Verarbeitung - die Stringverarbeitungsfunktionen von C verwenden \0 als Markierung "hier ist der String zu Ende". Und da ich mal davon ausgehe, daß diese Aufgabe noch nicht fertig ist, solltest du besser gleich vorausplanen.



  • Ein C-String ist auch als Nullterminierter String bekannt und endet wie der Name schon sagt mit einem Nullbyte. Ansonsten weiss man nicht wo der String aufhört da man in der Regel nur einen Zeiger auf ein char hat aber nicht die länge des Strings.



  • CStoll schrieb:

    Chris236 schrieb:

    die Null is für?

    Und da ich mal davon ausgehe, daß diese Aufgabe noch nicht fertig ist, solltest du besser gleich vorausplanen.

    Geh ich auch von aus. 😃



  • Ich hab aber noch keine Ausgabe, wo er mir dann sagt, wieviele Zeichen es sind oder? Zumindest, gibt er mir nix aus, wenn ich das Programm starte.


Anmelden zum Antworten