学科分类
目录
C语言

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文件内容

点击此处
隐藏目录