web-dev-qa-db-fra.com

Comment puis-je imprimer sur stderr en C?

En C, imprimer sur la sortie standard est facile, avec printf de stdio.h.

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

86
wad

La syntaxe est presque identique à celle de 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 la même chose, sauf que 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);
130
Fantastic Mr Fox

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)
25
Paul R
#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 en général. Cela peut conduire à des résultats étranges, comme ceux-ci, qui suggèrent que le code s'exécute dans le mauvais ordre. Ce n'est pas, c'est juste que le tampon stdout n'a pas encore été vidé. Bien entendu, les flux redirigés ou redirigés ne verront pas cet entrelacement car ils ne verraient normalement que la sortie de stdout uniquement ou de stderr uniquement.

  2. Bien qu'initialement stdout et stderr arrivent sur la console, ils sont tous deux séparés et peuvent être redirigés individuellement.

5
hasectic saif

Savez-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 deuxième argument est la chaîne de formatage et les autres sont les arguments comme d'habitude.

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

5

Si vous ne voulez pas modifier les codes actuels et juste pour utiliser le débogage.

Ajoutez cette macro:

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

Remplacez stderr par stdout si vous souhaitez revenir en arrière.

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

4
lxiange