流,标准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流。
说到这里
以上
在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流。
说到这里
以上
相关文章推荐
- 文件IO(标准IO缓冲区)
- [置顶] 内核态与用户态、系统调用与库函数、文件IO与标准IO、缓冲区等概念介绍
- 标准IO 计算缓冲区的长度<Ps:全缓存4096, 行缓存1024,不带缓存0>
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 标准 IO 库的缓冲区
- C++重载输入和输出操作符以及IO标准库中的刷新输入缓冲区残留字符问题
- 标准IO与文件IO 的区别
- 标准IO实现文件拷贝实例二
- 文件IO详解(四)---标准输入、标准输出和标准错误
- 标准IO的缓冲问题
- linux函数代码操练---文件操作-----标准IO库中的其他函数
- Linux c学习--从标准输入输出看流和缓冲区
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结
- linux下printf()函数和标准输出流的缓冲区类型
- 6 标准IO fopen/fclose
- 9-10 标准IO之gets,puts,fprintf,sprintf,fgetc,fputc
- java的重定向标准IO
- 系统编程--标准IO
- IO第十一回:处理流之四:标准输入流 & 标准输出流