Flujo stderr [Duda]

Iniciado por apoeti, 31 Agosto 2012, 18:32 PM

0 Miembros y 1 Visitante están viendo este tema.

apoeti

Hola.
No entiendo muy bien cuál es la utilidad del flujo stderr, ya que hace (hasta lo que he podido ver) lo mismo que stdout. Os pongo este código para explicarme mejor:
/* Demuestra la función remove(). */

#include <stdio.h>

main()
{
      char filename[80];
     
      printf("Enter the filename to delete: ");
      gets(filename);
     
      if(remove(filename) == 0)
          printf("The file %s has been deleted.", filename);
      else
          fprintf(stderr, "Error deleting the file %s.", filename);
}


Lo que quiero decir es que si no se podría poner en el else la función printf, pues sería lo mismo ¿Porqué se usa fprintf con el flujo stderr si a efectos prácticos va a ser lo mismo?

xiruko

#1
stderr es, como su nombre indica, la salida estandar de errores. este es util cuando por ejemplo, rediriges la salida de tu programa a un archivo. si en ese caso ocurre algun error en la ejecucion del programa y tienes puesta su salida por stderr, el error saldra en la terminal en vez de en el archivo. esto lo puedes probar con el mismo ejemplo que has puesto ejecutandolo desde terminal asi: ./main > prueba.txt  y veras como la salida normal del programa la imprime en el archivo, y en cambio los errores los dice por la terminal.

no se si me explique muy bien... igualmente, no se mas aplicaciones a parte de redirigir siempre los errores a la terminal para que asi no se te impriman en un archivo o algo parecido.

un saludo!

apoeti

Gracias por la respuesta, pero, ¿usando el flujo stdout no iría el error también a la terminal?

Saludos.

xiruko

#3
cuando ejecutas un programa hecho para la terminal, stdout y stderr (y stdin) significaran el mismo flujo, la terminal. pero si, por ejemplo, haces lo de redirigir la salida estandar del programa (stdout) a un archivo (con el operador > en la linea donde ejecutas el programa en la terminal) estaras cambiando stdout por el archivo, con lo que ahora tendras que:

stdout = archivo
stderr y stdin = terminal

por lo que todos los errores que tengas con fprintf(stderr,...) los veras en la terminal, pero la salida normal del programa, las que has hecho con printf(), las tendras en el archivo.

no se explicarme mejor... a ver si alguien mas dice algo.

un saludo!

edito: solo quiero añadir algo mas acerca de los flujos y quizas asi lo entiendes mejor. igual que puedes cambiar stdout por un archivo, tambien puedes cambiar stdin por uno. estos flujos no son mas que entradas y salidas predefinidas para tu programa, pero tu puedes cambiarlas cuando quieras para que asi las 3 no sean el mismo flujo (por defecto la terminal). para cambiar la entrada en este caso, y para el programa que has colgado al principio, podrias hacer un archivo de texto llamado "prueba.txt" y añadirle esta linea "./prueba.txt". ahora ejecutalo desde la terminal asi: ./main < prueba.txt (en este caso, el operador es < y no >). con esto estaras cambiando stdin, que pasara de recibir la entrada por la terminal a recibirla por el archivo. si todo va bien, deberia borrarse el archivo "prueba.txt".

avesudra

#4
A parte de lo ya dicho por xiruko te añado esto sacado de la página --> http://www.cplusplus.com/reference/clibrary/cstdio/stderr/
Cito lo que dice:
CitarAlthough generally both stdout and stderr are associated with the same console output, applications may differentiate between what is sent to stdout and what to stderr for the case that one of them is redirected. For example, it is frequent to redirect the regular output of a console program (stdout) to a file while expecting the error messages to keep appearing in the console screen.
Traducido(no se si está bien , es medio google medio cosecha propia):
CitarAunque generalmente stdout y stderr son asociados con la misma consola de salida ,  las aplicaciones pueden diferenciar entre lo que se envía a stdout y stderr en el caso de que una de ellas fuese redirigida. Por ejemplo, es frecuente redireccionar la salida regular de un programa de consola(stdout) a un archivo mientras los mensajes de error siguen apareciendo en la consola.
Regístrate en

apoeti

Gracias a los dos por vuestras respuestas. Ahora lo entiendo perfectamente.