Einen Teiltext in eine andere Datei schreiben



  • 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.



  • Die Funktion Etc_RedStr() (in der Version, die ich unten gepostet habe) liefert die Anzahl der kopierten Zeichen als Rückgabewert zurück - diese mußt du nur abfangen und ausgeben:

    int len1 = EtC_RedStr(d1,s1,'{','}',99);//du hast Platz für 99 Zeichen plus '\0', also kannst du den auch ausschöpfen
    
    fprintf(d2,"s1 nach etc: %s - Länge %d",s1,len1);
    

    (PS: Es wäre auch gut, wenn du zwischendurch etwas mitdenken würdest ;))



  • CStoll schrieb:

    (PS: Es wäre auch gut, wenn du zwischendurch etwas mitdenken würdest ;))

    Ich mach im Moment 8Std täglich nix anderes wie das...
    Heute fällts mir n bissl schwer, außerdem bin ich irgendwie noch net so richtig in der Lage mich da richtig reinzudenken...



  • wie kann ich denn ne gesamte Textfile einlesen?

    Etc_RedStr(d1,s1,':','{',50);
    

    Das bringts nich, weil ich ne ewig lange Textfile hab, bei der ich fast aus jeder Zeile was rauslesen muss...

    Danke schonmal. Auch für die ganze Hilfe, die du mir bisher gegeben hast.

    Gruß



  • Die Funktion liest auch nur einen einzelnen Ausdruck aus - die mußt du also so oft hintereinander aufrufen, bis du die komplette Datei eingelesen hast (am besten in einer Schleife):

    while(Etc_RedStr(d1,s1,'{','}',50)>=0)//Etc_RedStr() gibt -1 zurück, wenn es das Dateiende erreicht hat
    {
      verarbeite aktuelle Eingabe
    }
    


  • Kann ich das so in der Art machen? (Ich weiß is noch net fertig, aber vll is es schonmal net komplett falsch.

    while (Etc_RedStr(d1,s1,':','{',50))
       {
           if(s1==":") {Flag=1; continue;      }
           if(s1=="}") {fprintf(d2,"%c\n");    }
    
           if(Flag) {fprintf(d2,"%c",s1);      }
       }
    


  • Nein. Etc_RedStr() liefert dir doch bereits den Ausschnitt der Eingabedatei - also in deinem Fall alle Eingabezeichen zwischen dem Doppelpunkt und der Klammer. Das mußt du nur noch per printf() ausgeben:

    while (Etc_RedStr(d1,s1,':','{',50)>=0)
    {
      //in s1 steht der nächste Eingabestring
      fprintf(d2,"%s\n",s1);
    }
    


  • 💡 autsch 😃

    Ja sehr logisch.

    Jetzt muss ich nur noch folgendes definieren

    int Etc_RedStr(FILE* d,char* s,char dp,char ka,int nMax)
    

    ich meld mich bestimmt wieder 😉



  • Wieso nimmst du denn nicht die Funktion, die du schon hast, dafür?


Anmelden zum Antworten