标准输出、标准输入和标准出错 以及 缓冲

2014-07-24 19:13:55   最后更新: 2014-11-03 22:35:02   访问数量:557




对一个进程预定义了三个流,并且这三个流可以自动的被进程使用,他们就是标准输入、标准输出和标准出错。

通过预定义的文件指针 stdin、stdout和stderr加以引用,这三个文件指针同样定义于stdio.h中

 

标准IO库提供缓冲的目的是尽可能减少使用read和write的次数。

  • 标准IO提供了三种类型的缓冲:

(1)全缓冲

这种情况下,只有在填满标准IO缓冲区后才进行IO操作,对于驻留在磁盘上的文件通常是由标准IO库实施全缓冲的,在一个流上执行第一次流操作时,相关标准IO函数调用malloc获得需要使用的缓冲区

  • 冲洗(flush)

缓冲区可以由标准IO例程自动冲洗(如缓冲区被填满时),也可以调用fflush函数冲洗一个流

值得注意的是,对于标准IO,flush以为着将缓冲区中的内容写到磁盘上,而在终端驱动程序方面,flush意味着丢弃已存储在缓冲区中的数据

int fflush(FILE *stream)

 

定义于stdio.h头文件中,调用成功返回0,否则返回EOF,如果stream为NULL,则冲洗所有输出流

(2)行缓冲

在这种情况下,当在输入或输出中,遇到换行符时才执行IO操作,但如果在遇到换行符前缓冲区已经被填满,则立即执行IO操作

(3)不带缓冲

标准IO库不对字符进行缓冲存储,所以系统很可能会一个字符一个字符地完成读写

标准出错流stderr通常是不带缓冲的,以使得出错信息可以快速显示

  • ISO C要求:

  1. 当且仅当标准输入和标准输出不涉及交互式设备时,他们才是全缓冲的
  2. 标准出错决不会是全缓冲的

我们常常并不喜欢这些系统默认的情况,则可以调用下列两个函数中的一个更改流缓冲类型:

void setbuf(FILE *steam, char *buf); int setvbuf(FILE *stream, char *buf, int mode, unsigned size);

 

定义于stdio.h头文件中,若调用成功返回0,否则返回非0值

两个函数将缓冲区指定为buf(setbuf将缓冲区长度设置为BUFSIZ的值,setvbuf将缓冲区长度设置为size),一般指定后默认为全缓冲,如果buf为NULL,则关闭缓冲

对于setvbuf,我们可以通过mode参数指定所需的缓冲类型。

  • mode

_IOFBF  全缓冲

_IOLBF  行缓冲

_IONBF  不带缓冲

 

如果指定_IONBF,则忽略buf和size参数

  • 用setvbuf实现的setbuf
void setbuf (FILE *stream, char *buf) { if (buf == NULL) setvbuf (stream, buf, _IONBF, 0); else setvbuf (stream, buf, _IOFBF, BUFSIZ); }

 

 






读书笔记      技术帖      linux      unix      c++      cpp      c语言      龙潭书斋      apue      unix环境高级编程      io      缓冲      stdin      stderr      stdout      setbuf      setvbuf     


京ICP备15018585号