int setvbuf (FILE * fluxo, char * buffer, int modo, size_t tamanho);
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 |
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.
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.
#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;
}
setbuf função
BUFSIZ macro