概念:
不带缓冲I/O:指每个read和write都调用内核中的一个系统调用。也指在用户区没有缓存,在内核还是有缓存。在进行写操作时,将数据先复制到内核的缓冲区,然后排入对鞋。最后再写到磁盘。比如:要写20个字节,将要调用20次的write。
产生的问题:一次写多,多次调用系统调用,效率低下。
带缓冲I/O:指在系统调用上多加了一个缓冲区,来减少系统调用。
建立一个缓存区,通常用malloc来分配缓存,还创建一个包含文件和缓存区相关联的数据结构(FILE*),这些系统都为你做了,不需要你考虑。比如:要写20个字节,先把数据写到用户缓冲区,然后根据什么缓冲类型,在把数据写到内核缓冲区中。(读写模式有两个缓冲区)
1、文件I/0需用的函数:open、read、write、lseek、close。
操作的对象是文件描述符。
int open(const char* path,int oflag);
int open(const char* path,int oflag,mode_t mode); //返回文件描述符,失败-1.
ssize_t read(int fd,void* buf,size_t nbytes);
//返回读到的字节数,若到文件结尾,则为0,失败-1.
ssize_t write(int fd,void* buf,size_t nbytes); //返回以写的字节数,失败-1.
显示的为文件设置偏移量,off_t lseek(int fd,off_t offset,int whence);
//返回新的文件偏移量,失败-1.
2、标准I/0需用的函数:fopen、fread、fwrite、fgetc、fgets........
操作的对象时数据流。
标准I/O提供缓冲的目的是为了减少read、write的调用次数。
缓冲的类型:
1.全缓冲:当标准I/O缓冲区填满后才进行实际的I/O操作。
2.行缓冲:当在输入和输出时遇到换行符,就进行I/O操作。
3.不带缓冲:相当于read、write。stderr通常是不带缓存,就使得错误信息尽快显示。