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





                          弄了好半天,应该把流,标准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流。





说到这里 

以上









  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值