setbuf , setvbuf , setbuffer 或 setlinebuf 子例程
用途
将缓冲分配给流。
库
标准 C 库 (libc.a)
语法
描述
setbuf 子例程导致使用 Buffer 参数指向的字符数组,而不是自动分配的缓冲区。 在打开流之后,但在读取或写入流之前,使用 setbuf 子例程。
如果 Buffer 参数是一个空字符指针,那么输入/输出是完全无缓冲的。
在 stdio.h 文件中定义的常量 BUFSIZ指示需要数组的大小:
char buf[BUFSIZ];对于 setvbuf 子例程, Mode 参数确定 Stream 参数的缓冲方式:
| 项 | 描述 |
|---|---|
| _IOFBF | 使输入/输出完全缓冲。 |
| _IOLBF | 使输出行缓冲。 当写入新行,缓冲区已满或请求输入时,将清空缓冲区。 |
| _IONBF | 导致输入/输出完全无缓冲。 |
如果 Buffer 参数不是空字符指针,那么它指向的数组用于缓冲。 Size 参数指定用作缓冲区的数组的大小,但所有 Size 参数的字节不一定用于缓冲区。 缓冲区中的某些字节用于内部缓冲区管理。 如果 Size 参数的指定值小于内部缓冲区管理的必需值,那么 setvbuf 和 setbuffer 子例程将忽略指定的缓冲区并执行缓冲区的内部分配。
stdio.h 文件中的 BUFSIZ 常量是一个缓冲区大小。 如果输入或输出未缓冲,那么 setbuf 子例程将忽略 Buffer 和 Size 参数。 setbuffer 子例程是 setbuf 子例程的备用形式,在打开 Stream 之后,但在读取或写入它之前使用。 Buffer 字符数组的大小由 Size 参数确定。 使用 Buffer 字符数组,而不是自动分配的缓冲区。 如果 Buffer 参数是空字符指针,那么输入或输出是完全无缓冲的。
在正常情况下不需要 setbuffer 子例程,因为缺省文件 I/O 缓冲区大小是最佳的。
setlinebuf 子例程用于将 stdout 或 stderr 文件从缓冲块或未缓冲块更改为行缓冲块。 与 setbuf 和 setbuffer 子例程不同, setlinebuf 子例程可以在 Stream 处于活动状态时使用。
通常在文件上的第一个 getc 子例程或 putc 子例程时从 malloc 子例程获取缓冲区,但标准错误流 stderr除外。 通常不会缓冲。
定向到终端的输出流始终是线路缓冲的或未缓冲的。
包含 setbuffer 和 setlinebuf 子例程是为了与 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。 否则,如果为类型提供了无效值,或者无法接受请求,那么将返回非零值。