文件流缓冲区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件流缓冲区相关的知识,希望对你有一定的参考价值。


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;
}

本文出自 “迷荼” 博客,谢绝转载!

以上是关于文件流缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

Java IO流--使用缓冲流实现非文本文件和文本文件的复制

缓冲流

JAVA字节缓冲流代码实现所有类型文件的复制

缓冲区溢出漏洞实验

java 字节流与字符流的区别(转)

20165315 缓冲区溢出漏洞实验