user-0 提问: setvbuf函数的作用

回复:
user: user-1
content: setvbuf Controls stream buffering and buffer size.  int setvbuf( FILE *stream, char *buffer, int mode, size_t size );  Routine Required Header Compatibility  setvbuf <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  setvbuf returns 0 if successful, or a nonzero value if an illegal type or buffer size is specified.  Parameters  stream  Pointer to FILE structure  buffer  User-allocated buffer  mode  Mode of buffering  size  Buffer size in bytes. Allowable range: 2 < size < 32768. Internally, the value supplied for size is rounded down to the nearest multiple of 2.  Remarks  The setvbuf function allows the program to control both buffering and buffer size for stream. stream must refer to an open file that has not undergone an I/O operation since it was opened. The array pointed to by buffer is used as the buffer, unless it is NULL, in which case setvbuf uses an automatically allocated buffer of length size/2 * 2 bytes.  The mode must be _IOFBF, _IOLBF, or _IONBF. If mode is _IOFBF or _IOLBF, then size is used as the size of the buffer. If mode is _IONBF, the stream is unbuffered and size and buffer are ignored. Values for mode and their meanings are:  _IOFBF  Full buffering; that is, buffer is used as the buffer and size is used as the size of the buffer. If buffer is NULL, an automatically allocated buffer size bytes long is used.  _IOLBF  With MS-DOS, the same as _IOFBF.  _IONBF  No buffer is used, regardless of buffer or size.  Example  /* SETVBUF.C: This program opens two streams: stream1  * and stream2. It then uses setvbuf to give stream1 a  * user-defined buffer of 1024 bytes and stream2 no buffer.  */  #include <stdio.h>  void main( void ) {    char buf[1024];    FILE *stream1, *stream2;     if( ((stream1 = fopen( "data1", "a" )) != NULL) &&        ((stream2 = fopen( "data2", "w" )) != NULL) )    {       if( setvbuf( stream1, buf, _IOFBF, sizeof( buf ) ) != 0 )          printf( "Incorrect type or size of buffer for stream1\n" );       else          printf( "'stream1' now has a buffer of 1024 bytes\n" );       if( setvbuf( stream2, NULL, _IONBF, 0 ) != 0 )          printf( "Incorrect type or size of buffer for stream2\n" );       else          printf( "'stream2' now has no buffer\n" );       _fcloseall();    } }   Output  'stream1' now has a buffer of 1024 bytes 'stream2' now has no buffer   Stream I/O Routines  See Also   fclose, fflush, fopen, setbuf

user: user-2
content: 针作为它们的第一个参数),而且也应在对该流执行任何一个其他操作之前调用。 可以使用s e t b u f函数打开或关闭缓存机制。为了带缓存进行 I / O,参数buf 必须指向一个长 度为B U F S I Z的缓存(该常数定义在 < s t d i o . h >中)。通常在此之后该流就是全缓存的,但是如果 该流与一个终端设备相关,那么某些系统也可将其设置为行缓存的。为了关闭缓存,将 b u f设 置为N U L L。 使用s e t v b u f,我们可以精确地说明所需的缓存类型。这是依靠 m o d e参数实现的: _IOFBF 全缓存 _IOLBF 行缓存 _ I O N B F 不带缓存 如果指定一个不带缓存的流,则忽略 buf 和size 参数。如果指定全缓存或行缓存,则 buf 和s i z e 可以可选择地指定一个缓存及其长度。如果该流是带缓存的,而 buf 是N U L L,则标准I / O库将 自动地为该流分配适当长度的缓存。适当长度指的是由 s t r u c t结构中的成员 s t _ b l k s i z e所指定的 值(见 4 . 2节)。如果系统不能为该流决定此值(例如若此流涉及一个设备或一个管道),则分 配长度为B U F S I Z的缓存。  出处：  UNIX环境高级编程  第五章第四节

user: user-2
content: 这些函数一定要在流已被打开后调用(这是十分明显的,因为每个函数都要求一个有效的文件第 5章 标 准 I/O 库 下载 9 3 指针作为它们的第一个参数),而且也应在对该流执行任何一个其他操作之前调用。 可以使用s e t b u f函数打开或关闭缓存机制。为了带缓存进行 I / O,参数buf 必须指向一个长 度为B U F S I Z的缓存(该常数定义在 < s t d i o . h >中)。通常在此之后该流就是全缓存的,但是如果 该流与一个终端设备相关,那么某些系统也可将其设置为行缓存的。为了关闭缓存,将 b u f设 置为N U L L。 使用s e t v b u f,我们可以精确地说明所需的缓存类型。这是依靠 m o d e参数实现的: _IOFBF 全缓存 _IOLBF 行缓存 _ I O N B F 不带缓存 如果指定一个不带缓存的流,则忽略 buf 和size 参数。如果指定全缓存或行缓存,则 buf 和s i z e 可以可选择地指定一个缓存及其长度。如果该流是带缓存的,而 buf 是N U L L,则标准I / O库将 自动地为该流分配适当长度的缓存。适当长度指的是由 s t r u c t结构中的成员 s t _ b l k s i z e所指定的 值(见 4 . 2节)。如果系统不能为该流决定此值(例如若此流涉及一个设备或一个管道),则分 配长度为B U F S I Z的缓存。 伯克利系统首先使用 s t _ b l k s i z e表示缓存长度。较早的系统 V版本使用标准 I / O 常数B U F S I Z(其典型值是 1 0 2 4)。即使4 . 3 + B S D使用s t _ b l k s i z e决定最佳的I / O缓存 长度,它仍将B U F S I Z设置为1 0 2 4。 表5 - 1列出了这两个函数的动作,以及它们的各个选择项。 表5-1 setbuf 和setvbuf 函数 函 数 m o d e b u f 缓存及长度 缓存的类型 n o n n u l l 长度为B U F S I Z的用户缓存 全缓存或行缓存 s e t b u f N U L L (无缓存) 不带缓存 n o n n u l l 长度为s i z e的用户缓存 N U L L 合适长度的系统缓存 n o n n u l l 长度为s i z e的用户缓存 N U L L 合适长度的系统缓存 忽略 无缓存 _ I O F B F s e t v b u f _ I O L B F _ I O N B F 全缓存 行缓存 不带缓存