void setbuf (FILE * fluxo, char * buffer);
A função setbuf permite trocar entre o modo sem bufferização e o modo bufferização completa, para o fluxo especificado no parâmetro fluxo
.
Para colocar o fluxo no modo sem bufferização, é preciso especificar o buffer como NULL: setbuf(fluxo, NULL);
Para colocar o fluxo no modo bufferização completa, com um buffer especificado pelo chamante da função, é preciso passar um buffer de tamanho, no mínimo, BUFSIZ.
Tipos de bufferização:
Tipo | Descrição |
---|---|
Sem bufferização | Os dados são transmitidos logo ao serem escritos. |
Bufferização completa | Os dados são guardados até sua quantidade exceder o tamanho máximo do buffer. |
Bufferização por linha | Os dados são guardados em um buffer até uma nova linha (\n) ser escrita ou até preencherem o buffer, como na bufferização completa (o que acontecer antes). |
Bufferização padrão para os fluxos padrões, quando se referem a dispositivos interativos (exemplo: cmd do Windows, terminal do *nix):
Fluxo | Bufferização padrão |
---|---|
stdin | Bufferização por linha |
stdout | Bufferização por linha |
stderr | Bufferização por linha/Sem bufferização |
fluxo - Ponteiro para um objeto FILE
buffer - Buffer alocado pelo usuário da função. Pode ser nulo, desabilitando a bufferização.
Nenhum.
#include <stdio.h>
int main() {
char buffer[BUFSIZ];
FILE* arquivo = fopen("arquivo.txt", "w");
if(arquivo == NULL) {
fprintf(stderr, "Erro ao criar o arquivo.");
return 1;
}
setbuf(arquivo, buffer);
fprintf(arquivo, "Testando %d", 1);
/* os dados com certeza não foram escritos no disco ainda, pois o fluxo arquivo é bufferizado */
fflush(arquivo);
/* agora "Testando 1" com certeza já foi escrito no disco */
setbuf(arquivo, NULL);
fprintf(arquivo, "Testando %d", 2);
/* "Testando 2" com certeza já foi escrito no disco, pois o fluxo arquivo não é bufferizado */
fclose(arquivo);
return 0;
}
setvbuf função
BUFSIZ macro