Einen Teiltext in eine andere Datei schreiben



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



  • 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;
    }
    

Anmelden zum Antworten