当前位置: 技术问答>linux和unix
缓冲输入输出
来源: 互联网 发布时间:2016-11-12
本文导语: 基于流的操作最终都会调用read或write进行操作。即流的内部封装了这两个系统调用。 缓冲分如下三种: 全缓冲(相应宏_IO_FULL_BUF):直到缓冲区被填满,菜调用系统I/O函数。磁盘文件读写通常是全缓冲的。 行缓冲(相...
基于流的操作最终都会调用read或write进行操作。即流的内部封装了这两个系统调用。
缓冲分如下三种:
全缓冲(相应宏_IO_FULL_BUF):直到缓冲区被填满,菜调用系统I/O函数。磁盘文件读写通常是全缓冲的。
行缓冲(相应宏_IO_LINE_BUF):直到遇到换行符'n',才调用系统I/O函数。标准输入输出都是行缓冲的。
无缓冲(相应宏_IO_UNBUFFERED):没有缓冲,数据立即读入或输出到外存文件和设备上。例如标准出错。
对于写操作的缓冲都比较好理解,我现在对读操作的缓冲很迷糊,比如全缓冲,读的时候到底什么时候进行实际的读,是当待读的内容达到缓冲区大小吗?
再比如行缓冲,遇到换行符才进行实际读,如果实际上没读,又怎么知道有没有遇到换行符呢?
缓冲分如下三种:
全缓冲(相应宏_IO_FULL_BUF):直到缓冲区被填满,菜调用系统I/O函数。磁盘文件读写通常是全缓冲的。
行缓冲(相应宏_IO_LINE_BUF):直到遇到换行符'n',才调用系统I/O函数。标准输入输出都是行缓冲的。
无缓冲(相应宏_IO_UNBUFFERED):没有缓冲,数据立即读入或输出到外存文件和设备上。例如标准出错。
对于写操作的缓冲都比较好理解,我现在对读操作的缓冲很迷糊,比如全缓冲,读的时候到底什么时候进行实际的读,是当待读的内容达到缓冲区大小吗?
再比如行缓冲,遇到换行符才进行实际读,如果实际上没读,又怎么知道有没有遇到换行符呢?
|
scanf也类似
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
输入1 2 3但是不按回车,程序就会停在第一行,只有按了回车才会继续
scanf("%d", &a);
scanf("%d", &b);
scanf("%d", &c);
输入1 2 3但是不按回车,程序就会停在第一行,只有按了回车才会继续
|
还真没留意这个问题哈
个人理解:
1、对于行缓冲,输入时其实已经读入了,但是直到按回车之后,读函数(比如fgets)才返回给应用程序
2、对于普通文件,读时应该先读入一个完整的缓冲区的大小(即使应用程序只要求读一个字节),然后再返回给应用程序指定的字节
个人理解:
1、对于行缓冲,输入时其实已经读入了,但是直到按回车之后,读函数(比如fgets)才返回给应用程序
2、对于普通文件,读时应该先读入一个完整的缓冲区的大小(即使应用程序只要求读一个字节),然后再返回给应用程序指定的字节