2016-08-17 3 views
28

In C ist der Ausdruck auf stdout einfach, mit printf von stdio.h.Wie kann ich in C stderr drucken?

Wie aber kann stderr drucken? Wir können fprintf verwenden, um es scheinbar zu erreichen, aber seine Syntax scheint seltsam. Vielleicht können wir printf verwenden, um zu stderr zu drucken?

+4

Was ist so seltsam an der Syntax? Es ist Druck * wo *, * wie * und * was *. –

+4

Ich konzentriere mich darauf. Das einzige Problem, das sich aus der Frage ergibt, dass Sie die Lösung "seltsam" finden. Sonst gibt es keine Frage. Verwende 'fprintf'. –

+0

@Eugene. Ich stimme dir zu. Ich dachte, es wäre seltsam, da ich nicht erkannte, dass stderr eine Datei ist :) – wad

Antwort

59

Die Syntax ist fast die gleiche wie printf. Mit printf geben Sie das String-Format und dessen Inhalt, dh:

printf("my %s has %d chars\n", "string format", 30); 

mit fprintf es gleich ist, außer jetzt sind Sie auch den Ort Angabe zu drucken:

File *myFile; 
... 
fprintf(myFile, "my %s has %d chars\n", "string format", 30); 

Oder in Ihrem Fall:

fprintf(stderr, "my %s has %d chars\n", "string format", 30); 
+0

Sehr klar. Danke für diese Klarstellung. – wad

5

Kennen Sie sprintf? Es ist im Grunde die gleiche Sache mit fprintf. Das erste Argument ist das Ziel (die Datei im Fall von fprintf, d. H. stderr), das zweite Argument ist die Formatzeichenfolge und der Rest sind die Argumente wie üblich.

Ich empfehle auch this printf (and family) reference.

10

Beispiele:

printf("%s", "Hello world\n");    // "Hello world" on stdout (using printf) 
fprintf(stdout, "%s", "Hello world\n");  // "Hello world" on stdout (using fprintf) 
fprintf(stderr, "%s", "Stack overflow!\n"); // Error message on stderr (usign fprintf) 
3
#include<stdio.h> 

int main () { 
    printf("hello "); 
    fprintf(stderr, "HELP!"); 
    printf(" world\n"); 
    return 0; 
} 

$ ./a.exe 
HELP!hello world 
$ ./a.exe 2> tmp1 
hello world 
$ ./a.exe 1> tmp1 
HELP!$ 
  1. stderr ist normalerweise ungepuffert und stdout ist normalerweise. Dies kann zu einer seltsam aussehenden Ausgabe führen, die darauf hinweist, dass der Code in der falschen Reihenfolge ausgeführt wird. Es ist nicht, es ist nur, dass der Stdout-Puffer noch gelöscht werden muss. Umgeleitete oder Pipe-Streams würden diese Verschachtelung natürlich nicht sehen, da sie normalerweise nur die Ausgabe von nur stdout oder stderr sehen würden.

  2. Obwohl zunächst sowohl stdout als auch stderr zur Konsole kommen, sind beide getrennt und können individuell umgeleitet werden.

0

Ihrem Kontext zu drucken, Sie Code wie folgt schreiben:

FILE *fp; 
char *of; 
sprintf(of,"%s%s",text1,text2); 
fp=fopen(of,'w'); 
fprintf(fp,"your print line"); 
2

Wenn Sie nicht wollen, aktuelle Codes ändern und nur für Debug-Nutzung.

dieses Makro hinzufügen:

#define printf(args...) fprintf(stderr, ##args) 
//under GCC 
#define printf(args...) fprintf(stderr, __VA_ARGS__) 
//under MSVC 

ändern stderr zu stdout, wenn Sie zurück rollen soll.

Es ist hilfreich für das Debuggen, aber es ist keine gute Übung.

Verwandte Themen