190 votes

Comment puis-je imprimer sur stderr en C?

En C, imprimer sur stdout est facile, avec printf de stdio.h .

Cependant, comment peut-on imprimer sur stderr? Nous pouvons utiliser fprintf pour y parvenir apparemment, mais sa syntaxe semble étrange. Peut-être pourrions-nous utiliser printf pour imprimer sur stderr?

275voto

Ben Points 4733

La syntaxe est presque la même que printf . Avec printf vous donnez le format de la chaîne et son contenu, à savoir:

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

Avec fprintf c'est pareil, sauf que vous spécifiez également le lieu 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);
 

52voto

Paul R Points 104036

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)
 

18voto

hasectic saif Points 51
#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 est généralement. Cela peut conduire à bizarre sortie comme celle-ci, ce qui suggère code est en cours d'exécution dans le mauvais ordre. Il n'est pas, c'est juste que la sortie standard (stdout) de la mémoire tampon a encore à être vidées. Redirigés ou les canalisations de flux serait bien sûr de ne pas voir ce interleave comme ils le feraient normalement voir le résultat vers stdout seulement ou stderr.

  2. Bien qu'initialement les deux stdout et stderr venir à la console, les deux sont séparés et peuvent être individuellement redirigés.

6voto

lxiange Points 21

Si vous ne voulez pas modifier les codes actuels et juste pour le debuggage.

Ajouter cette macro:

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

Variation stderr de stdout si vous souhaitez revenir.

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

3voto

Joachim Pileborg Points 121221

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

Je recommande également cette référence printf (et famille) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X