setvbuf  função

Protótipo

int setvbuf (FILE * fluxo, char * buffer, int modo, size_t tamanho);

Descrição

A função setvbuf, como a setbuf, permite trocar entre o modo sem bufferização e o modo bufferização completa, para o fluxo especificado no parâmetro fluxo.

Além disso, a função setvbuf permite especificar um buffer e modo de bufferização específico para um fluxo.

setvbuf deve ser chamada quando o fluxo foi associado a um arquivo, mas antes de qualquer operação de entrada ou saída ter sido efetuada em cima do fluxo. Por exemplo, logo após uma chamada a função fopen.

Se o parâmetro buffer passado for NULL e o tamanho passado for diferente de zero, um buffer com o tamanho especificado será alocado automaticamente, e desalocado quando o fluxo for fechado. Essa funcionalidade é uma extensão ao padrão ANSI C, portanto pode não estar disponível em todas as plataformas. É recomendado que código escrito de forma a ser portável sempre utilize o tamanho 0 com buffers NULL.

Se o parâmetro buffer passado não for NULL, é responsabilidade do usuário da função desalocar o buffer (caso ele tenha sido alocado dinâmicamente com malloc) quando o fluxo for fechado.

Os arquivos são abertos, por padrão, com um buffer alocado automaticamente em modo bufferização completa, caso eles não se refiram a um dispositivo interativo. Dispositivo interativo é um dispositivo que o usuário do sistema possa interagir com ele (exemplo: cmd do Windows, terminal no *nix, etc). Dispositivos não interativos são arquivos, etc; não há interação direta com o usuário do sistema.

Bufferização padrão para os fluxos padrões, quando se referem a dispositivos interativos:

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. Se for nulo, a função aloca um buffer automaticamente.

modo - Especifica o modo da bufferização. Pode ser um dos três macros abaixo.

Modo Descrição
_IONBF Sem bufferização: Os dados são transmitidos logo ao serem escritos.
_IOFBF Bufferização completa: Os dados são guardados até sua quantidade exceder o tamanho máximo do buffer.
_IOLBF 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).

tamanho - Tamanho do buffer em bytes. Se o parâmetro buffer for nulo, esse parâmetro determina o tamanho do buffer alocado automaticamente pela função.

Valor de retorno

Se o buffer e/ou o modo entrou em ação com sucesso, o valor zero é retornado.

Caso tenha ocorrido alguma falha, um valor diferente de zero é retornado. Exemplo de falhas: modo inválido passado, erro ao alocar ou assimilar o buffer ao fluxo, etc.

Exemplo
#include <stdio.h>

int main() {
    char buffer[1024];

    FILE* arquivo = fopen("arquivo.txt", "w");
    if(arquivo == NULL) {
        fprintf(stderr, "Erro ao criar o arquivo.");
        return 1;
    }

    setvbuf(arquivo, buffer, _IOFBF, sizeof(buffer));
    /* as operações de escritas com o arquivo aqui só serão realmente escritas ao disco quando o buffer atingir 1024
    ou ocorrer uma chamada a fflush ou fclose utilizando o arquivo */

    fclose(arquivo);
    return 0;
}
Veja também

setbuf função

BUFSIZ macro