EDITO
Disculpa, lo escribí con prisas
Basicamente es:
Tienes una estructura tal que asi:
typedef struct _iobuf {
int cnt; //Caracteres que quedan en la memoria intermedia
char *ptr; //Puntero al siguiente carácter de la memoria intermedia
char *base; //Puntero al inicio de la memoria intermedia
int flag; //Modo de acceso al fichero
int fd; //Descriptor del fichero
}FILE;
Ahora, supongamos que tienes dos punteros a FILE, uno para el fichero a copiar(llamemosle flujo1), y el otro para el fichero destino(flujo2).
Entonces, lo que haces es:
Primeramente lees 1024 bytes(por decir algo) del flujo1, los pones en un puntero (char *base) y luego haces ptr = base.
Entonces, cada vez que haces un getc para tomar el siguiente carácter, se hace una comprobación, si nos hemos quedado sin memoria intermedia (--flujo1->cnt <0) , la volvemos a llenar, si todavía tenemos se toma el caracter de flujo1->ptr++
Cuando haces un putc, para copiar el carácter al fichero, también se comprueba si hay memoria intermedia. Si no la hay, se reserva memoria para el puntero flujo2->base del tamaño de 1024 bytes y hacemos que flujo2->ptr = flujo2->base, y se van colocando los caracteres en
flujo2->ptr++ = caracter_a_poner
a media que
se decrementa como antes.
Una vez flujo2->cnt llega a 0, se escribe en el fichero lo contenido en
, se coloca de nuevo el puntero al inicio de la memoria intermedia
flujo2->ptr = flujo2->base
y se vuelve a reservar memoria.
Entonces, como ves, unicamente se copia a disco cuanto
contiene los 1024 bytes que hemos leido con antes. Mi duda era porque no copiarlos de golpe, sin esperar a que la memoria intermedia este llena?
Espero que ahora me haya explicado mejor