_flushbuf这个函数与教材书上的没什么太大区别,思路是一样的.
首先判断fp文件是否在表示已经打开的数组_iob中
因为LINUX要对文件操作都需要先打开该文件.
然后判断该文件是否是需要写操作.只有写操作才用的上_flushbuf
然后判断是否需要缓冲区.并以此设置缓冲区大小.
然后如果缓冲区未设置,将开辟一块缓冲区供其使用,如果遇到错误.那么将文件状态设置为出错.并返回EOF.
如果缓冲区已经存在,就判断缓冲区中的内容有多少.保存在nc中.
然后将缓冲区base指向的nc个字符写入文件中.如果写入的数量与缓冲区中不一样,则表明发生了错误.
因为需要将已经传到_flushbuf函数的第一个参数那个字符也放入缓冲区.所以整体的缓冲区容量要-1.来容纳它.
这个是因为putc会一直会向缓冲区中写入字符,如果缓冲区满了,则会将最后这个字符以参数的形式传给_flishbuf,用他来重置缓冲区,而这个字符自然不能丢,所以直接就写入了缓冲区.
然后先看fflush函数.
先判断是否程序已经打开该文件.
然后如果是写的方式打开的文件,就调用_flushbuf函数.
_flushbuf函数会将缓冲区的内容用write系统调用写入文件中.而那个参数0会在写入文件之后才写入已经被刷新的缓冲区中.而这个缓冲区等一下就会被fclose释放.所以不用在意.
fclose就是释放这个文件指针.
首先通过fflush将缓冲区的数据写入文件没出错的话继续向下.
释放缓冲区空间.
重置指针,计数器和打开方式.