Einen Teiltext in eine andere Datei schreiben



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



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


Anmelden zum Antworten