有人可以解释一下int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
C函数是如何工作的吗?
我认为它为文件流设置了一个缓冲区,并将数据存储在setvbuf
大小的size_t
数据块中的{{1}}分配的缓冲区中,对不对?当缓冲区已满时,它会被刷新吗?
答案 0 :(得分:5)
我假设您搜索过Google,但是您需要一些帮助来了解您的搜索内容:
我引用了gnu documentation和cppreference:
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
注意以下事项:
fflush
FILE *fp
时会发生什么。buffer
字符串fputs
之后fp
包含的内容。rewind(fp)
重新阅读文件时会发生什么。不要害怕文档/手册页,如果你习惯了它们并阅读它们,你将成为一名优秀的开发人员,此外你现在熟悉http://en.cppreference.com/,这是一个非常好的开始有了新的API函数,祝你好运。