Comment puis-je imprimer sur stderr en C?

120

En C, l'impression vers stdout est facile, avec printffrom stdio.h.

Cependant, comment imprimer sur stderr? On peut l'utiliser fprintfpour y parvenir apparemment, mais sa syntaxe semble étrange. Peut-être pouvons-nous utiliser printfpour imprimer sur stderr?

liasse
la source
5
Qu'y a-t-il de si "étrange" dans sa syntaxe? C'est imprimer , comment et quoi .
Eugene Sh.
5
Je me concentre dessus. Le seul problème qui découle de la question, c'est que vous trouvez la solution "étrange". Sinon, il n'y a pas de question. Utilisez fprintf.
Eugene Sh.
@Eugène. Je suis d'accord avec toi. J'ai pensé que c'était étrange car je ne savais pas que stderr est un FICHIER :)
wad

Réponses:

179

La syntaxe est presque la même que printf. Avec printfvous donnez le format de la chaîne et son contenu c'est-à-dire:

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

Avec fprintfc'est la même chose, sauf que maintenant vous spécifiez également l'endroit où imprimer:

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

Ou dans votre cas:

fprintf( stderr, "my %s has %d chars\n", "string format", 30);
Fantastique Mr Fox
la source
34

Exemples:

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 (using fprintf)
Paul R
la source
9
#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 est généralement sans tampon et stdout l'est généralement. Cela peut conduire à une sortie étrange comme celle-ci, ce qui suggère que le code s'exécute dans le mauvais ordre. Ce n'est pas le cas, c'est juste que le tampon stdout n'a pas encore été vidé. Les flux redirigés ou canalisés ne verraient bien sûr pas cet entrelacement car ils ne verraient normalement que la sortie de stdout uniquement ou stderr uniquement.

  2. Bien qu'au départ, stdout et stderr arrivent sur la console, les deux sont séparés et peuvent être redirigés individuellement.

saif hasectique
la source
5

Le savez-vous sprintf? C'est fondamentalement la même chose avec fprintf. Le premier argument est la destination (le fichier dans le cas de fprintfie stderr), le second argument est la chaîne de format et le reste sont les arguments comme d'habitude.

Je recommande également cette printfréférence (et familiale) .

Un mec programmeur
la source
5

Si vous ne souhaitez pas modifier les codes actuels et uniquement pour une utilisation de débogage.

Ajoutez cette macro:

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

Passez stderrà stdoutsi vous souhaitez revenir en arrière.

C'est utile pour le débogage, mais ce n'est pas une bonne pratique.

lxiange
la source
0

Pour imprimer votre contexte, vous pouvez écrire un code comme celui-ci:

FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,'w');
fprintf(fp,"your print line");
Winterli
la source
Cela n'ajoute rien aux réponses précédentes et ne répond pas vraiment à la question.
Fantastique Mr Fox
Cette instruction sprintf () provoque une corruption de la mémoire! ... Je vous conseille vivement de lire comment fonctionnent les pointeurs, les tableaux et les chaînes.
BlueChip