Imprimir a stderr en C

Jinku Hu 12 octubre 2023
  1. Utilizar la función fprintf para imprimir en stderr en C
  2. Utilizar la función dprintf para imprimir en stderr en C
  3. Utilizar la función fwrite para imprimir en stderr en C
Imprimir a stderr 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!
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Artículo relacionado - C IO