标签:文件流缓冲区
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; }
本文出自 “迷荼” 博客,谢绝转载!
标签:文件流缓冲区
原文地址:http://runingday.blog.51cto.com/2154382/1867436