I\O操作之setbuf、setvbuf

设置文件缓冲区函数
  void setbuf(FILE *stream,char *buf);
  void setvbuf(FILE *stream,char *buf,int type,unsigned size);
  这两个函数将使得打开文件后,用户可建立自己的文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。  
  对于setbuf()函数,buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节。当选定buf为空时,setbuf函数将使的文件I/O不带缓冲。而对setvbuf函数,则由malloc函数来分配缓冲区。参数size指明了缓冲区的长度(必须大于0),而参数type则表示了缓冲的类型,其值可以取如下值:

type 值 含义
  _IOFBF 文件全部缓冲,即缓冲区装满后,才能对文件读写
  _IOLBF 文件行缓冲,即缓冲区接收到一个换行符时,才能对文件读写
  _IONBF 文件不缓冲,此时忽略buf,size的值,直接读写文件,不再经过文件缓冲区缓冲


/*
 * By : xiaolong
 * Date: 7,March
 * Fuction: check the buf of the I\O operation!
 *
 *
 * */
#include
#include
#include
#include

int main(int argc,char **argv)
{
    FILE *fp;
    char msg1[]="Hello,world\n";
    char msg2[]="Hello\nworld";
    char buf[128];
    if((fp=fopen("buf1.txt","w"))==NULL)
    {
        printf("fail to open the buf1.txt!\n");
        perror("Open error");
        return -1;
    }
    memset(buf,'\0',128);
    setbuf(fp,NULL);
    fwrite(msg1,7,1,fp);
    printf("Test setbuf(no buf)!\n");
    printf("Now buf data is :buf =%s\n",buf);
    getchar();
    fclose(fp);
    //打开一个文件,然后设置为nobuf情况,并检查关闭前流的情况
    if((fp=fopen("buf2.txt","w"))==NULL)
    {
        printf("Fail to open the buf2.txt!\n");
        perror("Open error");
        return -1;
    }
    memset(buf,'\0',128);
    setvbuf(fp,NULL,_IONBF,0);
    fwrite(msg1,7,1,fp);
    printf("Test setbuf(no buf)!\n");
    printf("Now buf data is :buf = %s\n",buf);
getchar();
    fclose(fp);
    //打开一个文件,然后设置为line buf情况,并肩查关闭流前的情况
    if((fp=fopen("buf3.txt","w"))==NULL)
    {
        printf("Fail to open the buf3.txt!\n");
        perror("Open error");
        return -1;
    }
    memset(buf,'\0',128);
    setvbuf(fp,buf,_IOLBF,sizeof(buf));
    fwrite(msg2,sizeof(msg2),1,fp);
    printf("Test setbuf(line buf)!\n");
    printf("Now buf data is :buf=%s\n",buf);
    getchar();
    fclose(fp);

    //打开一个文件,然后设置为full buf情况,并检查关闭流前的情况
    if((fp=fopen("buf4.txt","w"))==NULL)
    {
        printf("Fail to open the buf4.txt!\n");
        perror("Open fail");
        return -1;
    }
    memset(buf,'\0',128);
    setvbuf(fp,buf,_IOFBF,sizeof(buf));
    fwrite(msg2,sizeof(msg2),1,fp);
    printf("Test setbuf(full buf)!\n");
    printf("Now buf data is :buf =%s\n",buf);
    getchar();
    fclose(fp);
    return 0;
}


 对于前两种情况:不用按回车键,msg1的内容就会被写进目标文件当中(根据设置的写入大小,写入相应的数量)

而对于第三种:行缓冲(一般设置为128个字节,这里假设设置的为N个字节,缓冲会在先写入缓冲后,再写入文件!而只有当缓冲读到N-1个字节,或者遇到回车符,或者结束符,才会将缓冲区的内容写入文件,而不会等到调用fclose(fp)函数,在关闭文件流前写入文件!

对于第四种:全缓冲(会将所有内容先写入缓存,等所有内容写完后,经过调用fclose(fp),刷新了缓冲区,将缓冲区内容写入文件!


你可能感兴趣的:(I\O操作之setbuf、setvbuf)