printf-Problem



  • Habe vergessen zu fragen, was man denn mit dem "Ilen"-Befehl macht, d.h., was bewirkt dieser Befehl? Der Rest leuchtet ja ein!
    Danke,
    Rose



  • @Rose, lLen ist lediglich eine Variable.
    fseek verwendet man um den Positionszeiger innerhalb der Datei zu bewegen. Ich setze zuerst den Positionszeiger ans Ende der Datei SEEK_END und lasse mir dann mit ftell die Position geben. Diesen Wert speichere ich in der Variable lLen. Damit weiß ich dann wie groß die Datei ist. Als nächstes setze ich den Zeige wieder auf den Anfang. Zum Schluss lese ich lLen-Bytes aus der Datei in das Array b. Und wie dann schon AJ sagte, solltest du lieber fwrite zum schreiben in die zweite Datei verwenden anstatt fprintf.



  • Die wohl einfachste Methode, ne Datei auszugeben, ist

    int copy_file(FILE *in, FILE *out) {
      int c;
    
      if(!in || !out)
        return -1;
    
      while((c = fgetc(in)) != EOF) /* zeichenweise. Einfach, aber laaahm. */
        fputc(c, out); 
    
      return 0;
    }
    

    Performanter ist aber

    int copy_file(FILE *in, FILE *out) {
      static const int BUFSIZE = 128;
    
      char s[BUFSIZE];
    
      if(!in || !out)
        return -1;
    
      while(fgets(s, BUFSIZE, in)) /* Immer BUFSIZE Zeichen auf einmal. Schneller.  */
        fputs(s, out);
    
      return 0;
    }
    


  • Hm. Ich hab grad gesehen, dass static const int in C90 nicht zur Initialisierung von Arrays erlaubt ist. Ich finds zwar weniger schön so, aber was solls, so ist es ISO-C90:

    #include <stdio.h>
    
    int copy_file(FILE *in, FILE *out) {
      char s[128];
    
      if(!in || !out)
        return -1;
    
      while(fgets(s, 128, in))
        fputs(s, out);
    
      return 0;
    }
    

    Ansonsten kannste dir mit wilden Makro-Konstrukten weiterhelfen, aber...sieh selbst:

    #include <stdio.h>
    
    int copy_file(FILE *in, FILE *out) {
    #ifndef COPY_FILE_BUFSIZE     /* Auf die Art kann zur Compilezeit ne andere
                                   * Buffergröße mitgegeben werden */
    #define COPY_FILE_BUFSIZE 128
    #define ___CFBS_UNDEF         /* Damit wir nachher wissen, ob COPY_FILE_BUFSIZE
                                   * geundeft werden muss - nicht, dass wir nachher
                                   * dem Coder seine Makros unterm Hintern
                                   * wegziehen...                  */
    #endif
    
      char s[COPY_FILE_BUFSIZE];
    
      if(!in || !out)
        return -1;
    
      while(fgets(s, COPY_FILE_BUFSIZE, in))
        fputs(s, out);
    
      return 0;
    
    #ifdef ____CFBS_UNDEF         /* ggf. Kram undeffen            */
    #undef COPY_FILE_BUFSIZE
    #undef ____CFBS_UNDEF
    #endif
    }
    


  • für die Tipps und Anregungen. Ich glaube, ich nehme dann doch die Arrays . . .
    dazu habe ich nur eine Frage: Wenn ich, wie von Herrmann empfohlen, die Funktion fwrite nehme, funktioniert es nicht mehr und ich erhalte die Fehlermeldung
    error C2660: 'fwrite' : Funktion akzeptiert keine 3 Parameter
    Was heißt das nun wieder?
    Danke,
    Rose



  • @Rose, 0xdeadbeef's Vorschlag ist meinem wirklich überlegen 🙂 😃
    Vor allem bei großen Dateien ist meine Variante nicht sinnvoll.

    fwrite braucht 4 Parameter:
    (1) Zielpuffer
    (2) Größe der Datenblöcke
    (3) Anzahl der Datenblöcke
    (4) Dateihandle

    Beispiel in deinem Fall

    fwrite( b, sizeof( char ), lLen, Zeiger_aus );
    

    PS: Eventuell wäre ein Buch über C für dich nicht schlecht.



  • Da ich in Zukunft mit größeren Dateien arbeiten will, werde ich mir das mal aneignen . . .danke also an Oxdeadbeef!!!
    Das mit dem Buch wäre vermutlich keine schlechte Idee . . 😉
    Ich werde mich sicher an anderer Stelle noch einmal melden 😕
    bis dahin,
    Rose



  • Rose schrieb:

    danke also an Oxdeadbeef!!!

    Na du wirst doch wohl nicht unserem "toten Rindfleisch" sein Hex-Präfix unterschlagen wollen 😉



  • @beefy
    wie lange wartest du eigentlich in diesem Forum bist du dich registrierst?
    wirds wieder ein Jahr dauern? 😃



  • Klappt doch auch so ganz gut.


Anmelden zum Antworten