Einen Teiltext in eine andere Datei schreiben



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



  • mach ich ja

    aber modifizieren muss ich sie ja trotzdem...

    den teil übernehm ich:

    {
    int c,nc=0;
    
    while((c=fgetc(d))!=dp) {if(c==EOF) return(-1);}
    
    while((c=fgetc(d))!=ka)
       {
       }
    

    weil zähler und sowas brauch ich ja nichmehr...



  • mach ich ja

    aber modifizieren muss ich sie ja trotzdem...

    den teil übernehm ich:

    {
    int c,nc=0;
    
    while((c=fgetc(d))!=dp) {if(c==EOF) return(-1);}
    
    while((c=fgetc(d))!=ka)
       {
       }
    

    weil zähler und sowas brauch ich ja nichmehr...



  • Klar brauchst du die noch (und wenn nur, um festzustellen, ob du noch Platz in deinem Ziel-Array hast) - nimm die Funktion so, wie du sie hast, und ingorier' die Tatsache, daß der Rückgabewert die Stringlänge darstellt 😉



  • while((c=fgetc(d))!=kz)
      {
    
       if(c==EOF) return(-1);
    
       s[nc] = c;
    
       nc = nc + 1;
      }
    
      s[nc] = '\0';
    
     return (nc);
    

    so und schon fertig?



  • Chris236 schrieb:

    so und schon fertig?

    Abgesehen davon, daß du möglicherweise recht unvorsichtig mit dem Speicher umgehst (du übergibst als letzten Parameter an die Funktion den verfügbaren Platz für den einzulesenden String - also prüf doch auch, ob du nicht darüber hinausschreibst), sieht die Funktion durchaus annehmbar aus.

    PS: Randfrage: Darfst du eigentlich C++ Methoden verwenden? Oder schreibt ihr in reinem C? (in ersterem Fall würde ich dir empfehlen, anstelle von FILE* und char[] lieber std::fstream und std::string zu verwenden)



  • [quote="CStoll"]

    Chris236 schrieb:

    PS: Randfrage: Darfst du eigentlich C++ Methoden verwenden? Oder schreibt ihr in reinem C? (in ersterem Fall würde ich dir empfehlen, anstelle von FILE* und char[] lieber std::fstream und std::string zu verwenden)

    Ich schreib im C++ Borland Builder. Also denke ich, dass ich das verwenden dürfte. Allerdings gehts im Moment erstmal nur darum, dass ich mir Grundlagen aneigne.

    Ganz nebenbei. Kennst du n gutes Buch oder sowas, wo man sich das selber noch privat n bissl beibringen kann? Also C++.



  • Ich hab' zu Hause das Buch "The C++ Standard Library" von Jossutis, aber ob das für Anfänger so geeignet ist, weiß ich nicht. Aber du könntest dir mal die Zeit nehmen für meine Magazin-Artikel "Ein- und Ausgabe in C++" und "Stringverarbeitung in C++".



  • Durch den Thread hier wirst du bestimmt auch der Moderator mit den meinsten Beiträgen! 😃

    Hast n Link? 😉 Bestimmt sehr sinnvoll für mich. Den Syntaxcoloring hast ja schonmal auf Seite 1 gepostet.



  • Ja, ich habe einen Link, den führe ich ständig mit mir rum (wenn du auf das "Magazin-Autor" in meiner Signatur klickst, landest du bei der Liste der Artikel, die ich für's Magazin geschrieben habe).



  • CStoll schrieb:

    Abgesehen davon, daß du möglicherweise recht unvorsichtig mit dem Speicher umgehst (du übergibst als letzten Parameter an die Funktion den verfügbaren Platz für den einzulesenden String - also prüf doch auch, ob du nicht darüber hinausschreibst), sieht die Funktion durchaus annehmbar aus.

    Logisch ich schreib ja in nen Bereich rein, den ich garnichmehr definiert hab. Denn mein String hab ich ja auf 100 Zeichen begrenzt (s1=100). Er schreibt zwar schön in die .txt rein, bringt aber nach m compilieren n Fenster, das wohl darauf zurück zu führen ist.



  • Hi ich hab den Code jetzt n bissl verändert und hätt gern, dass er die ersten 6 Buchstaben nach m Doppelpunkt einliest:

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


  • Bitte, lies dir nochmal meine letzten Beiträge durch. Sicherheitshalber ein letztes Mal die Erklärung:

    Du übergibst der Funktion die maximale Zeichenanzahl, die sie lesen soll (das ist schonmal positiv), aber in der Funktion fängst du nirgends ab, ob diese Limit überschritten wurde (und das ist schlecht, weil der Funktion jetzt egal ist, was du für eine Größe übergeben hast). Wenn du schon nicht kapierst, wieso das wichtig ist, dann solltest du wenigstens die Beispielfunktionen verwenden, die ich dir gebe.

    PS: Solange du nicht zeigst, daß du über diesen Beitrag zumindest nachgedacht hast, kommt von mir keine Hilfe.



  • Nur falls es dich interessiert:

    int Etc_RedStr(FILE* d,char* s,char dp,int nMax)
    {
    int z;
    
    while((z=fgetc(d))!=dp)  { if(z==EOF)  return(0); }
    
    for(z=0;z<nMax;z++) {
    
      int c = fgetc(d);
    
      s[z] =  c;
    
      if(c==EOF) return(0);
    
    }
    
      return 1;
    }
    


  • Na das sieht doch schon recht brauchbar aus - jetzt fehlt nur noch der Null-Terminator für den String, dann kannst du damit auch weiterarbeiten.



  • Das sieht jetzt ungefähr so aus in der txt die ich einlese:

    :DocNam {_Doc_01.rtf}
    :CADNam {NoDef}
    :CusNam {}
    :ClcRem {}
    :PysTyp {GerRat}

    Jetzt will ich, dass er die Klammer auch noch einliest und ausgiebt. Hab ich so gemacht:

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

    Allerdings liest der n bissl falsch weil was rauskommt is das:

    DocNam’| {_Doc_01.rtf}
    CADNam1.rtf {NoDef}
    CusNam1.rtf {}
    ClcRem1.rtf {}
    PysTyp1.rtf {GerRat}

    Die txt is noch viel länger aber nur bei 2.-4. steht dieses "1.rtf" davor


Anmelden zum Antworten