setvbuf
|
Definido en el encabezado
<stdio.h>
|
||
| (hasta C99) | ||
| (desde C99) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
Cambia el modo de almacenamiento en búfer del flujo de archivo dado
stream
según lo indicado por el argumento
mode
. Además,
-
Si
bufferes un puntero nulo, redimensiona el búfer interno asize. -
Si
bufferno es un puntero nulo, instruye al flujo a usar el búfer proporcionado por el usuario de tamañosizecomenzando enbuffer. El flujo debe cerrarse (con fclose ) antes de que finalice el tiempo de vida del array apuntado porbuffer. Los contenidos del array después de una llamada exitosa asetvbufson indeterminados y cualquier intento de usarlo es comportamiento indefinido.
Contenidos |
Parámetros
| stream | - | el flujo de archivo al que establecer el búfer | ||||||
| buffer | - | puntero a un búfer para que lo use el flujo o puntero nulo para cambiar solo el tamaño y modo | ||||||
| mode | - |
modo de búfer a utilizar. Puede ser uno de los siguientes valores:
|
||||||
| size | - | tamaño del búfer |
Valor de retorno
0 en caso de éxito o distinto de cero en caso de fallo.
Notas
Esta función solo puede utilizarse después de que
stream
haya sido asociado con un archivo abierto, pero antes de cualquier otra operación (excepto una llamada fallida a
setbuf
/
setvbuf
).
No todos los
size
bytes se utilizarán necesariamente para el almacenamiento en búfer: el tamaño real del búfer normalmente se redondea hacia abajo a un múltiplo de 2, un múltiplo del tamaño de página, etc.
En muchas implementaciones, el almacenamiento en búfer por líneas solo está disponible para flujos de entrada de terminal.
Un error común es establecer el búfer de stdin o stdout a un arreglo cuyo tiempo de vida finaliza antes de que el programa termine:
El tamaño de búfer predeterminado BUFSIZ se espera que sea el tamaño de búfer más eficiente para E/S de archivos en la implementación, pero POSIX fstat frecuentemente proporciona una estimación mejor.
Ejemplo
Un caso de uso para cambiar el tamaño del búfer es cuando se conoce un tamaño mejor. (Este ejemplo utiliza algunas funciones POSIX, por ejemplo
fileno
. Véase también SO:
#1
y
#2
).
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize); if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) { perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
Salida posible:
BUFSIZ is 8192, but optimal block size is 65536
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.21.5.6 La función setvbuf (p: 225)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.21.5.6 La función setvbuf (p: 308)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.19.5.6 La función setvbuf (p: 273-274)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.5.6 La función setvbuf
Véase también
|
establece el búfer para un flujo de archivo
(función) |
|
|
Documentación de C++
para
setvbuf
|
|