fprintf c printf stderr

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!$

  1. 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.

  2. Aunque inicialmente tanto stdout como stderr llegan a la consola, ambos están separados y se pueden redirigir individualmente.