Imprimir a stderr en C
-
Utilizar la función
fprintf
para imprimir enstderr
en C -
Utilizar la función
dprintf
para imprimir enstderr
en C -
Utilizar la función
fwrite
para imprimir enstderr
en C
Este artículo introducirá múltiples métodos sobre cómo imprimir a stderr en C.
Utilizar la función fprintf
para imprimir en stderr
en C
La biblioteca estándar de E/S en C proporciona tres flujos de texto que se abren implícitamente cuando el programa se inicia en el sistema. Estos flujos son,
- entrada estándar (
stdin
) - utilizada para leer la entrada. - salida estándar (
stdout
) - se utiliza para escribir la salida. - flujo de error estándar (
stderr
) - utilizado para registrar mensajes de error o depuración durante el tiempo de ejecución.
Para imprimir datos en estos flujos, se utilizan las funciones de la familia printf
. La función fprintf
se emplea normalmente para imprimir texto en un flujo de salida específico. Cuando necesitamos imprimir en stderr
, nos dirigimos al flujo stderr
y lo pasamos como primer argumento a la función. El segundo argumento es la propia cadena de formato, que proporciona los medios para incluir diferentes objetos en la salida y construir el formato dado. Tenga en cuenta que incluimos múltiples cadenas en ""
ya que se concatenarán automáticamente durante la compilación.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fprintf(stderr, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
Producción :
[ERROR]: No string argument provided!
You must provide a program path as argument
Utilizar la función dprintf
para imprimir en stderr
en C
Alternativamente, podemos utilizar la función dprintf
, que es similar a la llamada fprintf
, excepto que toma el descriptor de fichero como primer argumento. Los descriptores de fichero en los sistemas basados en Unix son valores enteros asociados a los ficheros abiertos del programa.
Nótese que, la cabecera estándar de Unix - <unistd.h>
incluye definiciones de macros para estos tres flujos mencionados como - STDIN_FILENO
, STDOUT_FILENO
y STDERR_FILENO
. También definimos dos macros - RED
y NC
, que son simplemente secuencias de caracteres ASCII para modificar el color del texto en la salida.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
dprintf(STDERR_FILENO, RED "[ERROR]" NC
": No string argument provided! \n"
"You must provide a program path as argument\n");
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
Producción :
[ERROR]: No string argument provided!
You must provide a program path as argument
Utilizar la función fwrite
para imprimir en stderr
en C
Otra alternativa a las funciones anteriores es fwrite
. Se utiliza principalmente para la E/S de flujos binarios, pero también podemos llamarla para imprimir texto en flujos de salida. fwrite
toma cuatro argumentos, y el primero de ellos es el puntero a la cadena que necesita ser impresa. Los dos siguientes parámetros especifican el tamaño del número de datos almacenados en el puntero y el tamaño de cada uno de ellos. Como imprimimos una sola cadena, el tercer argumento puede ser 1
, y el tamaño corresponde a la longitud de la cadena. El cuarto parámetro es el FILE*
que apunta al flujo deseado.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define RED "\e[0;31m"
#define NC "\e[0m"
int main(int argc, char *argv[]) {
if (argc != 2) {
fwrite("[ERROR] : No string argument provided!\n", 39, 1, stderr);
exit(EXIT_FAILURE);
}
char *str = malloc(strlen(argv[1]) + 1);
strcpy(str, argv[1]);
printf("str: %s\n", str);
free(str);
exit(EXIT_SUCCESS);
}
Producción :
[ERROR] : No string argument provided!
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook