setbuf, setvbuf, setbuffer ou setlinebuf Subroutine

Propósito

Atribui buffering a um fluxo.

Biblioteca

Biblioteca C Padrão (libc.a)

Sintaxe

#include <stdio.h>
void setbuf ( Stream Buffer)
FILE *Stream;
char *Buffer;
int setvbuf (Stream, Buffer, Mode, Size)
FILE *Stream;
char *Buffer;
int  Mode;
size_t  Size;
void setbuffer (Stream, Buffer, Size)
FILE *Stream;
char *Buffer;
size_t Size;
void setlinebuf (Stream)
FILE *Stream;

Descrição

O subroutine setbuf faz com que a matriz de caracteres apontada pelo parâmetro Buffer seja usada em vez de um buffer alocado automaticamente. Use a subroutinha setbuf depois que um fluxo foi aberto, mas antes de ser lido ou escrito.

Se o parâmetro Buffer for um ponteiro de caracteres nulo, a input/output é completamente sem buffer.

Uma constante, BUFSIZ, definida no arquivo stdio.h , informa o quão grande uma matriz é necessária:

char buf[BUFSIZ];

Para o subroutine setvbuf , o parâmetro Mode determina como o parâmetro Stream é buffered:

Item Descrição
_IOFBF Faz com que o input/output seja totalmente bufferado.
_IOLBF Faz com que a saída seja linha-tampão. O buffer é flushed quando uma nova linha é escrita, o buffer está cheio, ou a entrada é solicitada.
_IONBF Faz com que a input/output seja completamente destampada.

Se o parâmetro Buffer não for um ponteiro de caractere nulo, a matriz que ele aponta é usada para buffering. O parâmetro Tamanho especifica o tamanho da matriz que é usada como um buffer, mas todos os bytes do parâmetro Tamanho não são necessariamente usados para a área de buffer. Alguns bytes do buffer são usados para o gerenciamento de buffer interno. Se o valor especificado do parâmetro Size for menor do que o valor necessário para gerenciamento de buffer interno, o setvbuf e as subroutines setbuffer ignoram o buffer especificado e executam uma alocação interna de buffer.

A constante BUFSIZ no arquivo stdio.h é um tamanho de buffer. Se a entrada ou saída for destampada, a subroutine setbuf ignora os parâmetros Buffer e Size . O subroutine setbuffer que é uma forma alternativa do subroutine setbuf , é usado depois que o Stream é aberto, mas antes de ser lido ou escrito. O tamanho da matriz de caracteres Buffer é determinado pelo parâmetro Size . A matriz de caracteres Buffer é usada em vez de um buffer alocado automaticamente. Se o parâmetro Buffer for um ponteiro de caractere nulo, a entrada ou saída é completamente destampada.

A subroutina setbuffer não é necessária em circunstâncias normais porque o tamanho do buffer de E/S de arquivo padrão é o ideal.

O subroutine setlinebuf é usado para alterar o arquivo stdout ou stderr do bloco buffered ou unbuffered to line-buffered. Ao contrário das subroutines setbuf e setbuffer , a subroutine setlinebuf pode ser usada qualquer vez que o Stream estiver ativo.

Um buffer é normalmente obtido a partir da subroutine malloc no momento da primeira subroutine getc ou subroutine putc no arquivo, exceto que o fluxo de erro padrão, stderr, normalmente não é buffered.

Os fluxos de saída direcionados aos terminais são sempre de linha-buffered ou sem buffer.

Nota: Uma fonte comum de erro é alocar espaço de buffer como uma variável automática em um bloco de código e, em seguida, falhar ao fechar o fluxo no mesmo bloco.

As subroutines setbuffer e setlinebuf estão incluídas para compatibilidade com o Berkeley System Distribution (BSD).

Parâmetros

Item Descrição
Fluxo Especifica o fluxo de entrada / saída.
de Saída Aponta para uma matriz de caracteres.
Modo Determina como o parâmetro Stream é buffered.
Tamanho Especifica o tamanho do buffer a ser utilizado.

Exemplo:

#include <stdio.h>

#define  SIZE  1024

int main(void)
{
	FILE *fp1;
	char buf[SIZE];
	memset( buf, '\0', sizeof( buf ));
	fp1 = fopen("file1", "r");

	/* Error Handling for fopen */

	if (setvbuf(fp1, buf, _IOFBF, SIZE) != 0)
			 printf("Not proper data provided to setvbuf\n");
	if (fclose(fp1))
			perror("fclose error");
}

Valores De Retorno

Após a conclusão bem-sucedida, setvbuf retorna um valor de 0. Caso contrário, ele retorna um valor não zero se um valor que não for válido for dado para o tipo, ou se o pedido não puder ser honrado.