zoukankan      html  css  js  c++  java
  • setbuf手册

    名称:

      setbuf, setbuffer, setlinebuf, setvbuf - stream buffering operations

    头文件及函数形式:

      #include <stdio.h>

      void setbuf(FILE *stream, char *buf);

      void setbuffer(FILE *stream, char *buf, size_t size);

      void setlinebuf(FILE *stream);

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

      Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

      setbuffer(), setlinebuf(): _BSD_SOURCE

    描述:

      有三种不同的缓存类型:unbuffered,block buffered,line buffered。如果一个输出流是unbuffered的,那么信息会在写的同时立即显示在输出文件上(包括文件和终端);如果是block buffered那么在写的时候很多字符将会存储起来并在缓存区写满或者调用fflush的时候一次性写出到文件;如果是line buffered那么字符将会存储起来知道出现换行符才会一次性写入到文件(当然,如果迟迟没有换行符直到缓存区写满也会写入到文件)(感觉最后一句翻译的不好,原文如下:when it is line

    buffered characters are saved up until a newline is output or input is read from any stream attached to a terminal device(typically stdin))

      正常情况下所有的文件都是block buffered。但是如果一个流指向一个终端(通常是stdout),那么它会是line buffered。标准错误流则总是默认为unbuffered的。

      setvbuf()函数通常用来改变一个打开的流的缓存。mode参数必须被指定为下面三个宏之一:

        _IONBF unbuffered

        _IOLBF line buffered

        _IOFBF fully buffered(block buffered)

      除了unbuffered文件,buf参数应该指向一个至少有size字节的缓存区(也就是一个内存)。如果buf参数为NULL,只有缓存模式被影响;一个新的缓存区将在下一个读或写的时候被分配。setvbuf函数通常在打开一个流之后对这个流执行任何操作之前使用。

      其他三个函数调用实际上就是setvbuf的别名。

      setbuf()等价于setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

      setbuffer()和setbuf()完全相同,除了它自己指定缓存区的大小而不是使用默认的BUFSIZ。

      setlinebuf()等价于setvbuf(stream, NULL, _IOLBF, 0);

    返回值:

      setbuf()函数调用成功返回0,调用失败返回非0(mode不合法或者请求不能兑现)。它会在失败的时候设置errno。

    BUGS:

      你必须保证buf指向的空间在流关闭的时候仍然存在,对于程序终端(标准输入输出流)也有这个要求。比如下面的这个例子是不合法的:

    #include <stdio.h>

    int
    main(void)
    {
      char buf[BUFSIZ];
      setbuf(stdin, buf);
      printf("Hello, world! ");
      return 0;
    }

    备注:感觉标准输入流有点迷,setvbuf的时候设置的缓存区有效,但是设置的缓存方式完全被无视了的节奏呀。

  • 相关阅读:
    职位晋升的潜规则
    mybatis中的多对多的查询
    mybatis的自关联查询
    Git使用步骤
    Junit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.
    Spring中的前置增强和后置增强
    Spring中的异常增强
    mybatis中session.getMapper()方法和resultMap
    mybatis中的多对一的查询
    mybatis中的一对多的查询
  • 原文地址:https://www.cnblogs.com/lthb/p/6598415.html
Copyright © 2011-2022 走看看