您的位置:首页 > 其它

流,标准IO,低级IO,缓冲区

2014-05-09 15:49 134 查看
                          弄了好半天,应该把流,标准IO,低级IO,缓冲区之间的关系有个直观的把握了。

                   在C的标准IO中,我们对IO输入一般是通过调用C标准库中的函数来操作IO的,一些列函数如,printf,sprintf,gets,fgets等等,

当然,标准IO里面还分为了对文件的IO和对默认输入输出文件的操作(f打头的函数均为对普通文件的操作,其余的则是对默认的输入输出文件的IO,即屏幕和键盘)

那么这些C库函数是怎样操作的呢?                    先要明确的是,在标准IO里面,这些函数都是对流的操作,那么什么是流呢?可以把流直观地理解为一段缓冲区,

如stdin便准输入流,可以把它理解为一段缓冲区,每个流都与一个文件相关连了,stdin流也不例外,它默认与屏幕这个文件(UNIX中一切皆文件的思想)向连。

当然,可以人为地把stdin流与其他的文件相关连,那么这个过程叫做重定向(流的重定向)。       

还有一个就是FILE*结构,这是一个文件指针,它指向的结构代表了与一个文件相关的一切信息,如该文件本身,和该文件相关的流(即缓冲区),等等。有时候我们用

这个结构就代表了流,如stdin可以看作是FILE*结构。    

即:标准C的IO函数都是对流的操作,如scanf是从流stdin中读入数据,printf是把数据输入到stdout流中,fgets(buf,MAXSIZE,fp),是从fp这个流中读入数据到buf中,

fputs(buff,fp)是把buff中的数据输入到fp这个流中。                         

但是:要注意的是,数据到了流中,不一定会立刻送如相关的文件中,这些缓冲区(流)会有一些缓冲机制,如行缓冲,但流中遇到\n号时,就会自动刷新到相关的文件中。

即APUE中有一句话是这样的:当我们用fopen打开一个文件时,这个文件此时就与一个流绑定了。。。。就好理解了。

在来看看低级IO,也就是IO系统调用。 如read,open,write。

它们这些系统调用函数,是直接与文件打交到的,没有缓冲,没有流的概念。

既然没有了流,它们怎么来标识一个文件呢,对了,它们利用文件标识符,即一个非负整数,如0代表标准输入即键盘,1代表标准输出即屏幕(默认的标准输入输入文件)。

可以想见                  write(1,"hello“,5)这个函数,会立即把hello在屏幕上显示出来,

                         而    printf("hello")      或 fprintf(stdout,"hello")就不会,它们只是送入了stdout流中,要等stdout流中的数据刷新到屏幕(文件)中时才会显示。当然,这需要遇到

\n 或后面有要执行的语句来自动刷新stdout流。

说到这里 

以上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: