fprintf - stderr c
¿Cómo puedo imprimir en stderr en C? (6)
En C, Imprimir en stdout es fácil, con
printf
de
stdio.h
.
Sin embargo, ¿cómo se puede imprimir en stderr?
Podemos usar
fprintf
para lograrlo aparentemente, pero su sintaxis parece extraña.
¿Quizás podamos usar
printf
para imprimir en stderr?
¿Conoces
sprintf
?
Básicamente es lo mismo con
fprintf
.
El primer argumento es el destino (el archivo en el caso de
fprintf
es decir,
stderr
), el segundo argumento es la cadena de formato y el resto son los argumentos como de costumbre.
También recomiendo
esta referencia de
printf
(y familia)
.
Ejemplos:
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", "!/n"); // Error message on stderr (using fprintf)
La sintaxis es casi la misma que
printf
.
Con
printf
le das el formato de cadena y su contenido, es decir:
printf("my %s has %d chars/n", "string format", 30);
Con
fprintf
es lo mismo, excepto que ahora también está especificando el lugar para imprimir:
File *myFile;
...
fprintf( myFile, "my %s has %d chars/n", "string format", 30);
O en tu caso:
fprintf( stderr, "my %s has %d chars/n", "string format", 30);
Para imprimir su contexto, puede escribir código como este:
FILE *fp;
char *of;
sprintf(of,"%s%s",text1,text2);
fp=fopen(of,''w'');
fprintf(fp,"your print line");
Si no desea modificar los códigos actuales y solo para el uso de depuración.
Agrega esta macro:
#define printf(args...) fprintf(stderr, ##args)
//under GCC
#define printf(args...) fprintf(stderr, __VA_ARGS__)
//under MSVC
Cambie
stderr
a
stdout
si desea retroceder.
Es útil para la depuración, pero no es una buena práctica.
#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 generalmente no tiene búfer y stdout generalmente no. Esto puede conducir a resultados de aspecto extraño como este, lo que sugiere que el código se está ejecutando en el orden incorrecto. No lo es, es solo que el búfer stdout aún no se ha vaciado. Las corrientes redirigidas o canalizadas, por supuesto, no verían esta intercalación, ya que normalmente solo verían la salida de stdout solo o stderr solamente.
-
Aunque inicialmente tanto stdout como stderr llegan a la consola, ambos están separados y se pueden redirigir individualmente.