Einen Teiltext in eine andere Datei schreiben



  • 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



  • Hat sich erledigt. Musste nur nen 2. char definieren. Und das l1 stand einmal zu viel drinnen.



  • Guten Morgen,

    wie mach ich denn das am dümmsten, wenn ich was einlesen will, er aber erst in der 3. Zeile anfangen soll.

    while (Etc_RedStr(d1,s1,':',6))
    {
        fprintf(d2,"%s",s1);
    }
    

    So aber wie lass ich die 1. 3 Zeilen aus?



  • Du könntest vor dieser Schleife solange Zeichen einlesen, bis du das dritte '\n' erreicht hast. (wenn du mit fstreams arbeiten würdest, könntest du auch dreimal ignore() aufrufen, um die ersten Zeilen zu überlesen)



  • Is da n Fehler drin?

    weil die Datei soll er so einlesen:

    einlesen.txt schrieb:

    :DocNam {_Doc_01.rtf}
    :CADNam {NoDef}
    :CusNam {}
    :ClcRem {}
    :PysTyp {GerRat} 7.000000000000000E+00 {1}
    :PysTyp {GerMtm} 2.810000000000000E-04 {kgcm^2}

    und das kommt raus:

    output.txt schrieb:

    DocNam {_Doc_01.rtf}0.000000 {NoDef}
    CusNam {}0.000000 {}
    PysTyp {GerRat}7.000000 {1}
    PysTyp {GerMtm}0.000281 {kgcm^2}

    hier der zugehörige code:

    int L01_RedFil(char* FilNam)
    {
    char s1[100];
    char s2[100];
    char s3[100];
    char s4[100];
    
    int l1,l3,l2;
    
    double Wert;
    
    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,s2,'{','}',50);
    
            fprintf(d2," {%s}",s2);
    
       fscanf(d1,"%lf",&Wert);
    
            fprintf(d2,"%lf",Wert);
    
       l3 = Etc_RedStr(d1,s4,'{','}',10);
    
            fprintf(d2,"     {%s}\n",s4);
    
    }
    

    fclose(d1);
    fclose(d2);

    return (0);

    }



  • bitte schließen
    bye


Anmelden zum Antworten