C风格输入输出
又称为标准I/O ,实现了三种类型的缓冲:
-
全缓冲:填满标准I/O缓冲区后才进行实际I/O操作
-
对于磁盘上的文件通常是实施全缓冲的
-
当缓冲区满时,标准I/O会自动flush缓冲区
-
或者调用
fflush()
函数来flush一个流 -
标准I/O方面,flush意味着将缓冲区内容写入磁盘,在终端驱动方面,flush表示丢弃存储在缓冲区中的数据
-
-
行缓冲:在输入和输出是遇到换行符时,标准I/O执行I/O操作
-
流涉及到一个终端时,实施行缓冲
-
在输入输出遇到换行符时,执行I/O操作
-
操作单个字符
(fputs)
时,也是在写了一行之后才进行实际的I/O操作 -
行缓冲的长度是固定的,只要填满了缓冲区,无论有没有换行符都会进行I/O操作
-
每次从一个不带缓冲的流或一个行缓冲的流得到输入数据,name就会flush所有行缓冲输出流,意思是前面有几个带缓冲的流,并且还没有到进行I/O操作的时候,接下来出现一个flush缓冲区的流,会将之前的数据也一起进行I/O操作。
-
-
不带缓冲:不对字符进行缓冲存储
-
如文件I/O输入输出
read()
与write()
-
通常
stderr
是不带缓冲的,使得错误信息能都很快显示出来
-
printf(); // 终端输出是行缓冲,文件输出是全缓冲,错误输出是不缓冲
putc();
fputs();
scanf();
getc();
fgets();
getline();
C++风格输入输出
C++风格的输入输出流和C风格的类似,因为其内部实现用的也是C风格输入输出
cin >> ;
cout << ;
endl // endl 表示 '\n' + flush
C++ 好的一点在于
-
通过对<<运算符重载,可以实现连续的输出以及不带输出类型的输出
-
endl
与'\n'
的区别:-
endl
不仅实现了换行操作,还对输出缓冲区进行flush
-
文件I/O输入输出
又被称为不带缓冲的I/O ,读或写完之后会直接输出,相当于每次执行完之后都会flush
缓冲区。但在文件读写时会导致频繁的读写磁盘,会影响速度。
#include <unistd.h>
ssize_t read(inf fd, void* buf, size_t nbytes);
n = read(STDIN_FILENO, buf, BUFFSIZE); // 从标准输入中读取数据
// STDIN_FINLNO与STDOUT_FILENO常量定义在#include<stdlib.h>中
ssize_t write(int fd, const void* buf, size_t nbytes);
n = write(STDOUT_FILENO, buf, n); // 向标准输出中写入数据
默认情况
-
当标准输入和标准输出不指向终端设备时,它才是全缓冲的,如文件操作
-
标准错误一般是不带缓冲的
-
若是指向终端设备的流,一般是行缓冲的
参考文献
《UNIX环境高级编程》
https://www.cnblogs.com/ncgds/p/5759551.html