如何在C中使用setvbuf()

时间:2014-06-07 09:17:29

标签: c

有人可以解释一下int setvbuf(FILE *stream, char *buffer, int mode, size_t size) C函数是如何工作的吗?

我认为它为文件流设置了一个缓冲区,并将数据存储在setvbuf大小的size_t数据块中的{{1}}分配的缓冲区中,对不对?当缓冲区已满时,它会被刷新吗?

抱歉,我是新来的

1 个答案:

答案 0 :(得分:5)

我假设您搜索过Google,但是您需要一些帮助来了解您的搜索内容:

我引用了gnu documentationcppreference

 int setvbuf (FILE *stream, char *buf, int mode, size_t size)
  

打开一个流后(但在任何其他操作之前)   在它上面执行),你可以明确指定什么样的缓冲   你希望它使用setvbuf函数。列出的设施   在本节中,在头文件stdio.h中声明。

参数描述:

  

stream - 将缓冲区设置为

的文件流      

buffer - 指向要使用的流的缓冲区的指针

     

模式 - 使用缓冲模式。它可以   是以下值之一:

     

_IOFBF full buffering

     

_IOLBF线路缓冲

     

_IONBF没有缓冲   大小 - 缓冲区的大小

如果您切换cppreference中的c文档,您会找到以下示例:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int file_size;
    char buffer[BUFSIZ];
    FILE * fp = fopen("test.txt","w+");
    if (setvbuf(fp,buffer,_IOFBF,BUFSIZ) != 0)
    {
       perror("setvbuf()");
       fprintf(stderr,"setvbuf() failed in file %s at line # %d\n", __FILE__,__LINE__-3);
       exit(EXIT_FAILURE);
    }

    /* Exhibit the contents of buffer. */
    fputs ("aaa",fp);
    printf("%s\n", buffer);
    fputs ("bbb",fp);
    printf("%s\n", buffer);
    fputs ("ccc",fp);
    printf("%s\n", buffer);
    file_size = ftell(fp);
    printf("file_size = %d\n", file_size);
    fflush (fp);              /* flush buffer */
    printf("%s\n", buffer);
    fputs ("ddd",fp);
    printf("%s\n", buffer);
    fputs ("eee",fp);
    printf("%s\n", buffer);

    rewind(fp);               /* flush buffer and rewind file */
    char buf[20];
    fgets(buf,sizeof buf,fp);
    printf("%s\n", buf);

    fclose(fp);

    return 0;
}

输出:

aaa
aaabbb
aaabbbccc
file_size = 9
aaabbbccc
dddbbbccc
dddeeeccc
aaabbbcccdddeee

注意以下事项:

  1. fflush FILE *fp时会发生什么。
  2. buffer字符串fputs之后fp包含的内容。
  3. 当你rewind(fp)重新阅读文件时会发生什么。
  4. 不要害怕文档/手册页,如果你习惯了它们并阅读它们,你将成为一名优秀的开发人员,此外你现在熟悉http://en.cppreference.com/,这是一个非常好的开始有了新的API函数,祝你好运。