2011-01-05 9 views
4

Ich versuche, eine Funktion zu schreiben, die mich an die Konsole und eine Datei in CSchreiben in eine Datei und Konsole in C

ich den folgenden Code haben schreiben können, aber ich erkannte, dass es mir nicht erlauben, Argumente anhängen (wie printf).

#include <stdio.h> 

int footprint (FILE *outfile, char inarray[]) { 
    printf("%s", inarray[]); 
    fprintf(outfile, "%s", inarray[]); 
} 

int main (int argc, char *argv[]) { 

    FILE *outfile; 
    char *mode = "a+"; 
    char outputFilename[] = "/tmp/footprint.log"; 
    outfile = fopen(outputFilename, mode); 

    char bigfoot[] = "It Smells!\n"; 
    int howbad = 10; 

    footprint(outfile, "\n--------\n"); 

    /* then i realized that i can't send the arguments to fn:footprints */ 
    footprint(outfile, "%s %i",bigfoot, howbad); /* error here! I can't send bigfoot and howbad*/ 

    return 0; 
} 

Ich stecke hier fest. Irgendwelche Tipps? Für die Argumente, die ich senden möchte, um zu funktionieren: Fußabdrücke, wird es aus Strings, Zeichen und ganzen Zahlen bestehen.

Gibt es andere printf oder fprintf fns, die ich versuchen kann, einen Wrapper um zu erstellen?

Vielen Dank und hoffen, Ihre Antworten zu hören.

+0

http://stackoverflow.com/questions/1719784/c-programming-forward-variable-argument-list See. – Bill

Antwort

5

Sie können <stdarg.h> Funktionalität und vprintf und vfprintf verwenden. Z.B.

void footprint (FILE * restrict outfile, const char * restrict format, ...) { 

    va_list ap1, ap2; 

    va_start(ap1, format); 
    va_copy(ap2, ap1); 

    vprintf(format, ap1); 
    vfprintf(outfile, format, ap2); 

    va_end(ap2); 
    va_end(ap1); 
} 
+0

+1 aber wahrscheinlich besser für Foprint, um zwei Argumente plus die var args zu nehmen; die Datei und das Format wie fprintf, so dass er tatsächlich die Formatzeichenfolge angeben kann (sonst sogar, dass Sie eine var arg-Funktion haben, können Sie immer nur eine var angeben:/ –

+0

@Jason Coco: Essential, es war insgesamt versaut auf Mein Teil. Jetzt behoben. –

0

Funktionen printf, scanf usw. verwenden Argumente mit variabler Länge. Here ist ein Tutorial, wie Sie Ihre eigene Funktion erstellen können, um Argumente mit variabler Länge zu verwenden.

0

Ja, es gibt verschiedene Versionen von printf. Die eine, nach dem Sie suchen, ist wahrscheinlich vfprintf:

int vfprintf(FILE *stream, const char *format, va_list ap); 

Funktionen wie printf müssen variadische Funktionen sein (dh: eine dynamische Anzahl von Parametern nehmen).


Hier ein Beispiel:

int print(FILE *outfile, char *format, ...) { 
    va_list args; 
    va_start (args, format); 
    printf(outfil, format, args); 
    va_end (args); 
} 

Beachten Sie, dass dies genau so, wie printf die einzigen Parameter nimmt: Sie ein Integer-Array nicht drucken kann dies direkt mit.

+0

Danke für das Update, Peoro! – Poliquin

-1

Sie könnten einen Zeichenpunkt übergeben, der auf Ihre Zeichenfolge zeigt?

z.B. (Syntax nicht aktiviert, aber Sie eine Idee geben)

#include <stdio.h> 

int footprint (FILE *outfile, char * inarray) { 
    printf("%s", inarray); 
    fprintf(outfile, "%s", inarray); 
} 

int main (int argc, char *argv[]) { 

    FILE *outfile; 
    char *mode = "a+"; 
    char outputFilename[] = "/tmp/footprint.log"; 
    outfile = fopen(outputFilename, mode); 

    char bigfoot[] = "It Smells!\n"; 
    int howbad = 10; 

    //footprint(outfile, "\n--------\n"); 
    char newString[255]; 
    sprintf(newString,"%s %i",bigfoot, howbad); 

    footprint(outfile, newString); 

    return 0; 
} 
+0

Danke, Clockwork Bear! Ich nehme an, Sie sind nicht Schweizer. :) Es würde meinen Zweck der Ersetzung der print_to_file und Konsole zu ersetzen, wenn ich die Sprintf-Funktion gefolgt von der angenommen Fußabdruckfunktion. – Poliquin