stdio.h


Función setvbuf ANSI C

int setvbuf(FILE *stream, char *acumulador, int modo, size_t tamanyo);

Esta función sólo puede ser usada después de que el stream apuntado por stream ha sido asociado con un fichero abierto y antes de otra operación cualquiera es llevada acabo al stream. El argumento modo determina cómo stream será almacenado según lo siguiente: _IOFBF ocasiona la entrada/salida a ser completamente almacenado; _IOLBF ocasiona la entrada/salida a almacenar por líneas; _IONBF ocasiona la entrada/salida a no ser almacenado. Si acumulador no es un puntero nulo, el array al que es apuntado puede ser usado en vez de la acumulación adjudicada por la función setvbuf. El argumento tamanyo especifica el tamaño del array. El contenido del array en cualquier ocasión es indeterminado.

stdout y stdin no son almacenados si no son redirigidos; de lo contrario, son completamente almacenados. "No Almacenados" quiere decir que los caracteres escritos a un stream son inmediatamente transmitidos al fichero o dispostivo, mientras que "Almacenados" significa que los caracteres son acumulados y escritos como un bloque de información.

Los tres valores de modo son éstos:

_IOFBF Cuando un acumulador esté vacío, la siguiente operación intentará llenar el acumulador completamente. En salida, el acumulador será completamente llenado antes de cualquier dato sea escrito en el fichero.
_IOLBF Cuando un acumulador esté vacío, la siguiente operación intentará llenar el acumulador completamente. En salida, sin embargo, el acumulador será transmitido y despejado en cuanto un carácter de línea nueva sea escrito en el fichero.
_IONBF Los parámetros acumulador y tamanyo son ignorados. Cada operación de entrada leerá directamente desde el fichero, y cada operación de salida inmediatamente escribirá los datos al fichero.

Valor de retorno:

La función setvbuf retorna cero cuando tiene éxito, o un valor cualquiera excepto cero, si un valor inválido es pasado a modo o si la operación no se puede llevar a cabo.

Ejemplo:

#include <stdio.h>

int main()
{
  char mensaje[BUFSIZ];

  setvbuf( stderr, mensaje, _IOFBF, BUFSIZ );

  printf( "Este mensaje se puede mostrar sin problemas\n" );
  fprintf( stderr, "\nPero este mensaje solo se muestra\n" );
  fprintf( stderr, "cuando el acumulador para stderr se llene\n" );
  fprintf( stderr, "o cuando se llame a fflush\n\n" );

  fflush( stderr );

  return 0;
}