对比C语言中的setbuf()函数和setvbuf()函数的使用

C语言setbuf()函数:把缓冲区与流相关联
头文件:

#include <stdio.h>

函数setbuf()用于将指定缓冲区与特定的文件流相关联,实现操作缓冲区时直接操作文件流的功能。其原型如下:

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

【参数】stream为文件流指针,buf为缓冲区的起始地址。

如果参数buf 为NULL 指针,则为无缓冲,setbuf()相当于调用setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZE)。

说明:在打开文件流后,读取内容之前,可以调用setbuf()来设置文件流的缓冲区(而且必须是这样)。

【实例】观察缓冲区与流关联后的影响。

#include <stdio.h>
char outbuf[BUFSIZ];
int main(void)
{
  setbuf(stdout, outbuf); // 把缓冲区与流相连
  puts("This is a test of buffered output.\n");
  puts(outbuf);
  fflush(stdout); // 刷新
  puts(outbuf); // 输出
  return 0;
}

输出结果:

This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..
This is a test of buffered output..

程序先把outbuf与输出流相连,然后输出一个字符串,这时因为缓冲区已经与流相连,所以outbuf中也保存着这个字符串,紧接着puts函数又输出一遍,所以现在outbuf中保存着两个一样的字符串。刷新输出流之后,再次puts,则又输出两个字符串。

C语言setvbuf()函数:设置文件流的缓冲区
头文件:

 #include <stdio.h>

函数setvbuf()用来设定文件流的缓冲区,其原型为:

  int setvbuf(FILE * stream, char * buf, int type, unsigned size);

【参数】stream为文件流指针,buf为缓冲区首地址,type为缓冲区类型,size为缓冲区内字节的数量。

参数类型type说明如下:

  • _IOFBF (满缓冲):当缓冲区为空时,从流读入数据。或当缓冲区满时,向流写入数据。
  • _IOLBF (行缓冲):每次从流中读入一行数据或向流中写入—行数据。
  • _IONBF (无缓冲):直接从流中读入数据或直接向流中写入数据,而没有缓冲区。

【返回值】成功返回0,失败返回非0。

该函数涉及流和缓冲区的知识,请参考C语言流和缓冲区(缓存)专题。

如果您只是想简单的操作缓冲区,还可以使用setbuf()函数,请查看:C语言setbuf()函数

setbuf()和setvbuf()函数的实际意义在于:用户打开一个文件后,可以建立自己的文件缓冲区,而不必使用fopen()函数打开文件时设定的默认缓冲区。这样就可以让用户自己来控制缓冲区,包括改变缓冲区大小、定时刷新缓冲区、改变缓冲区类型、删除流中默认的缓冲区、为不带缓冲区的流开辟缓冲区等。

说明:在打开文件流后,读取内容之前,调用setvbuf()可以用来设置文件流的缓冲区(而且必须是这样)。

【实例】为文件设置特殊类型缓冲区。

#include <stdio.h>
int main(void)
{
  FILE *input, *output;
  char bufr[512];
  input = fopen("file.in", "w+");   /*打开文件*/
  output = fopen("file.out", "w");
  if (setvbuf(input, bufr, _IOFBF, 512) != 0) /*失败*/
  {
   printf("failed to set up buffer for input file\n");
  }
  else
  {
   printf("buffer set up for input file\n");
}
  if (setvbuf(output, NULL, _IOLBF, 132) != 0) /*为流指定特殊的缓冲区*/
  {
   printf("failed to set up buffer for output file\n");
}
  else
  {
   printf("buffer set up for output file\n");
  }
  fclose(input);
  fclose(output);
  return 0;
}

运行结果:

Buffer set up for input file
Buffer set up for output file

程序先打开两个文件,分别设置缓冲区,根据返回值判定是否成功,最后使用fclose函数关闭这两个文件。

(0)

相关推荐

  • 对比C语言中的setbuf()函数和setvbuf()函数的使用

    C语言setbuf()函数:把缓冲区与流相关联 头文件: #include <stdio.h> 函数setbuf()用于将指定缓冲区与特定的文件流相关联,实现操作缓冲区时直接操作文件流的功能.其原型如下: void setbuf(FILE * stream, char * buf); [参数]stream为文件流指针,buf为缓冲区的起始地址. 如果参数buf 为NULL 指针,则为无缓冲,setbuf()相当于调用setvbuf(stream, buf, buf ? _IOFBF : _IO

  • C语言中“不受限制”的字符串函数总结

    "不受限制的"字符串函数 按<C和指针>中所说,那些常用的字符串函数都是"不是限制的",就是说它们只能通过寻找字符串末尾的NULL来判断字符串的长度. strlen strlen函数用于求解字符串长度,其返回类型为unsigned int(即size_t).strlen函数从起点开始,往后计数,遇到'\0'停止. 值得注意的是:strlen函数的返回类型.看如下代码: #include<string.h> #include<iostre

  • R语言中cbind、rbind和merge函数的使用与区别

    cbind: 根据列进行合并,即叠加所有列,m列的矩阵与n列的矩阵cbind()最后变成m+n列,合并前提:cbind(a, c)中矩阵a.c的行数必需相符 rbind: 根据行进行合并,就是行的叠加,m行的矩阵与n行的矩阵rbind()最后变成m+n行,合并前提:rbind(a, c)中矩阵a.c的列数必需相符 > a <- matrix(1:12, 3, 4) > print(a) [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,

  • python语言中pandas字符串分割str.split()函数

    目录 前言 1.常规赛数据格式 2.计算詹姆斯常规赛命中率 总结 前言 为了介绍python语言中pandas库在数据分析中的重要作用,本人打算以NBA球星勒布朗詹姆斯在2020-2021赛季常规赛个人数据为例对pandas相关函数进行详细说明.利用爬虫技术,在知名篮球网站虎扑爬取了勒布朗詹姆斯的数据,稍后会将数据上传至csdn,以供大家下载. 这篇文章,详细介绍了pandas字符串分割函数---str.split()的用法. DataFrame.str.split(pa,n,expand)pa

  • 对比C语言中execv相关的执行文件的三个函数

    C语言execv()函数:执行文件函数 头文件: #include <unistd.h> 定义函数: int execv (const char * path, char * const argv[]); 函数说明:execv()用来执行参数path 字符串所代表的文件路径, 与execl()不同的地方在于execve()只需两个参数, 第二个参数利用数组指针来传递给执行文件. 返回值:如果执行成功则函数不会返回, 执行失败则直接返回-1, 失败原因存于errno 中. 错误代码:请参考 ex

  • 简单对比C语言中的fputs()函数和fputc()函数

    C语言fputc()函数:写文件函数(将一指定字符写入文件流中) 头文件: #include <stdio.h> 定义函数: int fputc(int c, FILE * stream); 函数说明:fputc 会将参数c 转为unsigned char 后写入参数stream 指定的文件中. 返回值:fputc()会返回写入成功的字符, 即参数c. 若返回EOF 则代表写入失败. 范例 #include <stdio.h> main() { FILE * fp; char a[

  • 详细对比C语言中的chmod()函数和fchmod()函数

    C语言chmod()函数:修改文件权限 头文件: #include <sys/types.h> #include <sys/stat.h> 定义函数: int chmod(const char * path, mode_t mode); 函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限. 参数 mode 有下列数种组合: 1.S_ISUID 04000 文件的 (set user-id on execution)位 2.S_ISGID 02000 文

  • 对比C语言中memccpy()函数和memcpy()函数的用法

    C语言memccpy()函数:复制内存中的内容 头文件: #include <string.h> 定义函数: void * memccpy(void *dest, const void * src, int c, size_t n); 函数说明:memccpy()用来拷贝src 所指的内存内容前n 个字节到dest 所指的地址上.与memcpy()不同的是,memccpy()会在复制时检查参数c 是否出现,若是则返回dest 中值为c 的下一个字节地址. 返回值:返回指向dest 中值为c 的

  • 对比C语言中getc()函数和ungetc()函数的使用

    C语言getc()函数:从流中读取字符 头文件: #include <stdio.h> 函数getc()用于从流中取字符,其原型如下: int getc(FILE *stream); [参数]参数*steam为要从中读取字符的文件流. [返回值]该函数执行成功后,将返回所读取的字符. [说明]若从一个文件中读取一个字符,读到文件尾而无数据时便返回EOF.getc()与fgetc()作用相同,但在某些库中getc()为宏定义,而非真正的函数. [实例]下面的示例演示了getc()函数的使用,在程

  • 简要对比C语言中的setgid()函数和setregid()函数

    C语言setgid()函数:设置真实的组识别码 头文件: #include <unistd.h> 定义函数: int setgid(gid_t gid); 函数说明:setgid()用来将目前进程的真实组识别码(real gid)设成参数gid 值. 如果是以超级用户身份执行此调用, 则real.effective 与savedgid 都会设成参数gid. 返回值:设置成功则返回0, 失败则返回-1, 错误代码存于errno 中. 错误代码: EPERM:并非以超级用户身份调用, 而且参数gi

随机推荐