setbuf  função

Protótipo

void setbuf (FILE * fluxo, char * buffer);

Descrição

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
Parâmetros

fluxo - Ponteiro para um objeto FILE

buffer - Buffer alocado pelo usuário da função. Pode ser nulo, desabilitando a bufferização.

Valor de retorno

Nenhum.

Exemplo
#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;
}
Veja também

setvbuf função

BUFSIZ macro