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?
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);
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)
#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!$
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.
Bien qu'initialement stdout et stderr arrivent sur la console, ils sont tous deux séparés et peuvent être redirigés individuellement.
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)) .
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.