De modo que una secuencia FILE puede tener búferes de entrada y salida. Puede ajustar la secuencia de salida utilizando setvbuf
(no conozco ningún método para jugar con el tamaño y el comportamiento del búfer de entrada).¿Buffer de entrada y salida predeterminado para archivos fopen'd?
Además, de forma predeterminada, el almacenamiento intermedio es BUFSIZ
(no estoy seguro de si esto es una cosa de POSIX o C). Está muy claro lo que esto significa para stdin
/stdout
/stderr
, pero ¿cuáles son los valores predeterminados para los archivos recién abiertos? ¿Están almacenados en búfer tanto para entrada como para salida? ¿O tal vez solo uno?
Si se almacena en el búfer, ¿la salida predeterminada es bloquear o modo de línea?
EDIT: He hecho algunas pruebas para ver cómo la respuesta de Jonathan Leffler afectó a los programas del mundo real. Parece que si haces una lectura, entonces escribes. La escritura hará que la porción no utilizada del búfer de entrada caiga por completo. De hecho, habrá algunas búsquedas que se realizan para mantener las cosas en las compensaciones de archivos correctas. He utilizado este sencillo programa de pruebas:
/* input file contains "ABCDEFGHIJKLMNOPQRSTUVWXYZ" */
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *f = fopen("test.txt", "r+b");
char ch;
fread(&ch, 1, 1, f);
fwrite("test", 4, 1, f);
fclose(f);
return 0;
}
resultó en el sistema siguiente llama:
read(3, "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n", 4096) = 27 // attempt to read 4096 chars, got 27
lseek(3, -26, SEEK_CUR) = 1 // at this point, I've done my write already, so forget the 26 chars I never asked for and seek to where I should be if we really just read one character...
write(3, "test", 4) = 4 // and write my test
close(3) = 0
Si bien estos son claramente los detalles de implementación que nos parecieron ser muy interesante en cuanto a cómo podría ser la biblioteca estándar implementado. Gracias a Jonathan por tu perspicaz respuesta.
BUFSIZ está en el estándar C - también está en POSIX, por lo tanto. –
Comportamiento no definido: debe 'fseek()' entre 'fread()' y 'fwrite()' - y cuando no lo haga, la implementación puede hacer lo que quiera (que puede o no ser lo que desea). –