setvbuf()函数
setvbuf()函数与setbuf()函数的功能都是为输入流和输出流设置缓冲区。不同的是setvbuf()函数可以指定缓冲模式,该函数的声明如下所示:
int setvbuf(FILE *stream, char *buf, int mode, size_t size);
上述函数声明中,参数stream表示一个文件指针。参数buf是分配的缓冲区,如果设置为NULL,该函数会自动分配指定大小的缓冲,参数size表示缓冲区的大小,以字节为单位。参数mode表示文件缓冲模式,缓冲模式一共有三种,具体如下:
(1) IOFBF,全缓冲,当缓冲区为空时,从流读入数据,或者当缓冲区满时,向流写入数据。
(2) IOLBF,行缓冲,每次从流中读入一行数据或向流中写入一行数据。
(3) IONBUF,不使用缓冲。接从流中读入数据或直接向流中写入数据,而没有缓冲区。此时参数buffer和参数size参数被忽略。*
setvbuf()函数调用成功返回0,失败返回非零值。
接下来通过一个具体案例来学习setvbuf ()函数的使用,如例1所示。
例1 setvbufFile.c
1 #define _CRT_SECURE_NO_WARNINGS
2 #include <stdio.h>
3 int main()
4 {
5 FILE* fp;
6 char buff[1024]; //设置缓冲区大小
7 memset(buff, 0, sizeof(buff)); //缓冲区清零
8 if (setvbuf(stdout, buff, _IOFBF, 1024) != 0) //定义缓冲区方式为全缓冲
9 {
10 printf("缓冲区设置出错!");
11 return -1; //缓冲失败则退出
12 }
13 fprintf(stdout, "www.itcast.cn\n"); //保存到缓冲区buff中
14 fprintf(stdout, "《C语言程序设计教程》\n");
15 fflush(stdout); //刷新缓冲区的数据
16 fp = fopen("txt.txt", "a+"); //打开文件
17 fprintf(fp, buff); //将缓冲区内容写入到文件中
18 fclose(fp); //关闭文件
19 return(0);
20 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第8~12行代码用于设置缓冲区为全缓冲模式,如果设置失败,打印出错信息,函数返回;第13~15行代码将到标准输出流stdout中的字符保存到buff中,并通过fflush()函数刷新缓冲区的数据显示在控制台中,最后将缓冲区buff中的数据保存到文件txt.txt中,打开写入的文件内容如图2所示。
图2 txt.txt文件内容