extern void setbuf(FILE *__restrict __stream, char *__restrict __buf, int __ modes, size_t __n)
此函数第一个参数为要操作的流对象,第2个参数buf必须指向一个长度为BUFSIZE的缓冲区,如果将buf设置为NULL,则关闭缓冲区。
如果执行成功,将返回0, 否则返回非0值。
setvbuf函数声明如下:
extern int setvbuf(FILE * __restrict __stream, char *__restrict __buf, int __modes, size_t __n)
此函数第1个参数为要操作的流对象;第2个参数buf指向一个长度为第4个参数指示大小的缓冲区,第3个参数为缓冲区类型
分别定义如下:
#define _IOFBF 0 //全缓冲
#define _IOLBF 1 //行缓冲
#define _IONBF 2 //无缓冲
#include <stdio.h>
#include <stdlib.h>
#include <error.h>
#include <string.h>
int main(void)
{
FILE *fp;
char msg1[] = "hello,world";
char msg2[] = "hello\nworld";
char buf[128];
if((fp=fopen("no_buf1.txt", "w")) == NULL)
{
perror("file open failure!");
return(-1);
}
setbuf(fp, NULL); //关闭缓冲区
memset(buf, '\0', 128); //字符串buf初始化'\0'
fwrite(msg1, 7, 1, fp); //向fp所指向的文件流中写7个字符
printf("test setbuf(no buf)!check no_buf1.txt\n");
printf("now buf data is: buf=%s\n", buf); //因为关闭了缓冲区,所以buf中无数据
printf("press enter to continue!\n");
getchar();
fclose(fp);
if((fp =fopen("no_buf2.txt", "w")) == NULL)
{
perror("file open failure!");
return(-1);
}
setvbuf(fp, NULL, _IONBF, 0); //设置为无缓冲模式
memset(buf, '\0', 128);
fwrite(msg1, 7, 1, fp);
printf("test setvbuf(no buf)!check no_buf2.txt\n");
printf("now buf data is :buf=%s\n", buf);
printf("press enter to continue!\n");
getchar();
fclose(fp);
if((fp=fopen("l_buf.txt", "w")) == NULL)
{
perror("file open failure!");
return(-1);
}
/*
* 设置为行缓冲
* 遇到'\n'就会刷新缓冲区
* 所以后面buf中只显示world字符,
* 在调用fclose()之前,
* 文件中写入的内容为"\n"之前的内容
*/
setvbuf(fp, buf, _IOLBF, sizeof(buf));
memset(buf, '\0', 128);
fwrite(msg2, sizeof(msg2), 1, fp);
printf("test setvbuf(line buf)!check 1_buf.txt, because line buf, only data before enter send to file\n");
printf("now buf data is :buf=%s\n", buf);
printf("press enter to continue!\n");
getchar();
fclose(fp);
if((fp=fopen("f_buf.txt", "w")) == NULL)
{
perror("file open failure!");
return(-1);
}
/*
* 设置为全缓冲模式
* 会将msg2 <=128 字符的数据全部写入缓冲区buf
* 这时查看buf,里面的内容是所有msg2的字符串的内容
* 在调用fclose()之前,缓冲区的内容是不会刷新到文件中去的
* 所以文件中的内容会为空
* 直到调用fclose()才会把内容写到文件中去
*/
setvbuf(fp, buf, _IOFBF, sizeof(buf));
memset(buf, '\0', 128);
fwrite(msg2, sizeof(msg2), 1, fp);
printf("test setbuf(full buf)!check f_buf.txt\n");
printf("now buf data is: buf=%s\n", buf);
printf("press enter to continue!\n");
getchar();
fclose(fp);
return 0;
}
转载于:https://blog.51cto.com/runingday/1867436