setbuf , setvbuf , setbuffer 或 setlinebuf 子例程

用途

将缓冲分配给流。

标准 C 库 (libc.a)

语法

#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;

描述

setbuf 子例程导致使用 Buffer 参数指向的字符数组,而不是自动分配的缓冲区。 在打开流之后,但在读取或写入流之前,使用 setbuf 子例程。

如果 Buffer 参数是一个空字符指针,那么输入/输出是完全无缓冲的。

stdio.h 文件中定义的常量 BUFSIZ指示需要数组的大小:

char buf[BUFSIZ];

对于 setvbuf 子例程, Mode 参数确定 Stream 参数的缓冲方式:

描述
_IOFBF 使输入/输出完全缓冲。
_IOLBF 使输出行缓冲。 当写入新行,缓冲区已满或请求输入时,将清空缓冲区。
_IONBF 导致输入/输出完全无缓冲。

如果 Buffer 参数不是空字符指针,那么它指向的数组用于缓冲。 Size 参数指定用作缓冲区的数组的大小,但所有 Size 参数的字节不一定用于缓冲区。 缓冲区中的某些字节用于内部缓冲区管理。 如果 Size 参数的指定值小于内部缓冲区管理的必需值,那么 setvbufsetbuffer 子例程将忽略指定的缓冲区并执行缓冲区的内部分配。

stdio.h 文件中的 BUFSIZ 常量是一个缓冲区大小。 如果输入或输出未缓冲,那么 setbuf 子例程将忽略 BufferSize 参数。 setbuffer 子例程是 setbuf 子例程的备用形式,在打开 Stream 之后,但在读取或写入它之前使用。 Buffer 字符数组的大小由 Size 参数确定。 使用 Buffer 字符数组,而不是自动分配的缓冲区。 如果 Buffer 参数是空字符指针,那么输入或输出是完全无缓冲的。

在正常情况下不需要 setbuffer 子例程,因为缺省文件 I/O 缓冲区大小是最佳的。

setlinebuf 子例程用于将 stdoutstderr 文件从缓冲块或未缓冲块更改为行缓冲块。 与 setbufsetbuffer 子例程不同, setlinebuf 子例程可以在 Stream 处于活动状态时使用。

通常在文件上的第一个 getc 子例程或 putc 子例程时从 malloc 子例程获取缓冲区,但标准错误流 stderr除外。 通常不会缓冲。

定向到终端的输出流始终是线路缓冲的或未缓冲的。

注: 常见的错误源是将缓冲区空间作为代码块中的自动变量分配,然后无法关闭同一块中的流。

包含 setbuffersetlinebuf 子例程是为了与 Berkeley System Distribution (BSD) 兼容。

参数

描述
指定输入/输出流。
缓冲区 指向字符数组。
方式 确定如何缓冲 Stream 参数。
大小 指定要使用的缓冲区的大小。

示例

#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");
}

返回值

成功完成后, setvbuf 将返回值 0。 否则,如果为类型提供了无效值,或者无法接受请求,那么将返回非零值。