stdin,stdout,stderr详解

来源:计算机等级考试    发布时间:2012-08-28    计算机等级考试视频    评论

  NAME

  setbuf, setbuffer, setlinebuf, setvbuf - 流缓冲操作

  SYNOPSIS 览

  #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);

  DESCRIPTION 述

  有三种类型的缓冲策略,它们是无缓冲,块缓冲和行缓冲。当输出流无缓冲时,信息在写的同时出现于目标文件或终端上;当是块缓冲时,字符被暂存,然后一起写入;当是行缓冲时,字符被暂存,直到要输出一个新行符,或者从任何与终端设备连接的流中(典型的是stdin)读取输入时才输出。函数 fflush(3)可以用来强制提前输出。(参见 fclose(3)) 通常所有文件都是块缓冲的。当文件I/O操作在文件上发生时,将调用 malloc(3)

  ,获得一个缓冲。如果流指向一个终端 (通常 stdout都是这样),那么它是行缓冲的。标准错误流 stderr 默认总是无缓冲的。

  函数setvbuf 可以用在任何打开的流上,改变它的缓冲。参数 mode必须是下列三个宏之一:

  _IONBF 无缓冲

  _IOLBF 行缓冲

  _IOFBF 完全缓冲

  除非是无缓冲的文件,否则参数 buf 应当指向一个长度至少为size字节的缓冲;这个缓冲将取代当前的缓冲。如果参数 buf 是NULL,只有这个模式会受到影响;下次 read 或 write操作还将分配一个新的缓冲。函数 setvbuf只能在打开一个流,还未对它进行任何其他操作之前使用。

  其他三个函数调用是函数setvbuf的别名,函数setbuf与使用下列语句完全等价:

  setvbuf(stream, buf, buf ? _IOFBF : _IONBF, BUFSIZ);

  函数 setbuffer 与此相同,但是缓冲的长度由用户决定,而不是由默认值 BUF-SIZ 决定。函数 setlinebuf 与使用下列语句完全等价:

  setvbuf(stream, (char *)NULL, _IOLBF, 0);

  函数 setvbuf 成功执行时返回 0。它失败时可能返回任何值,但是当 It can return any value on failure, but returns nonzero when mode不正确,或者不能实现请求时,必须返回非零值。它在失败时可能设置errno。其他函数没有返回值。

  函数 setbuf 和 setvbuf 遵 ANSI X3.159-1989 (``ANSI C'') 标准。

  BUGS

  函数 setbuffer 和 setlinebuf 无法移植到 4.2BSD 之前的 BSD 版本,在Linux 中仅在 libc 4.5.21 之后的系统中可用。在 4.2BSD 和 4.3BSD 系统中,setbuf 总是使用非最优的缓冲大小,应当避免使用它。

  在stream被关闭时,必须确保buf和它指向的空间仍然存在。这通常发生在程序终止时。

  例如,下列调用是非法的:

  #include <stdio.h>

  int main()

  {

  char buf[BUFSIZ];

  setbuf(stdin, buf);

  printf("Hello, world!/n");

  return 0;

  }

  编辑特别推荐:

  优化的冒泡排序C代码

视频学习

我考网版权与免责声明

① 凡本网注明稿件来源为"原创"的所有文字、图片和音视频稿件,版权均属本网所有。任何媒体、网站或个人转载、链接转贴或以其他方式复制发表时必须注明"稿件来源:我考网",违者本网将依法追究责任;

② 本网部分稿件来源于网络,任何单位或个人认为我考网发布的内容可能涉嫌侵犯其合法权益,应该及时向我考网书面反馈,并提供身份证明、权属证明及详细侵权情况证明,我考网在收到上述法律文件后,将会尽快移除被控侵权内容。

最近更新

社区交流

考试问答