文件I/O(不带缓存)++标准I/O(带缓存)

来源:互联网 发布:循序渐进学java 编辑:程序博客网 时间:2024/06/07 07:17

概念

      不带缓冲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通常是不带缓存,就使得错误信息尽快显示。

  

     

       

原创粉丝点击