标准的IO是自带缓冲的。这一点避免了应用程序需要考虑缓冲这一点带来的麻烦,而其最具迷惑的也正是这缓冲。
APUE课本中提到标准IO提供了三种类型的缓冲(全缓冲、行缓冲和不带缓冲),弄清楚其特征尤为重要。
ISO C要求下列缓冲特征:
1)当且仅当标准输入和标准输出并不涉及交互式设备时,它们才是全缓冲的;
2)标准出错绝不会是全缓冲的。
对于1),我们可以这样理解:只要标准输入和输出改变了其流向,不再与键盘或终端进行输入或者输出时,它们就是全缓冲的。
但是,我们并不知道当标准输入和输出涉及到交互式设备时它们是行缓冲还是不带缓冲,同时也不知道标准出错是行缓冲还是不带缓冲。很多系统默认使用以下缓冲方式:
(1)标准出错不带缓冲;
(2)如若是涉及终端设备的其他流,则它们是行缓冲的;否则是全缓冲的。
怎么理解(2)呢?首先,我们可以知道:凡是跟终端设备(keyboard或者terminal)有关的流都是行缓冲的;凡是跟终端设备无关的流都是全缓冲的。
对于行缓冲有点要注意的:
行缓冲的标准IO执行IO操作(输入或者输出)有两种情况:
a)遇到了换行符;
b)填满了行缓冲区。