zoukankan      html  css  js  c++  java
  • 文件io和标准io的联系

     linix对IO文件的操作分为不带缓存的IO操作(文件IO都是不带缓存IO)和带缓存的标准IO操作.
      刚开始,要明确以下几点:     
      不带缓存,其实不是直接对磁盘文件进行读取操作,像read()和write()函数,它们都属于系统调用,只不过在用户层没有缓存,所以叫做无缓存IO,但对于内核来说,还是进行了缓存,只是用户层看不到罢了。
    1.  linux的文件I/O是一种低级的I/O,由操作系统提供的基本IO服务。(底层)
       而标准I/O是ANSIC建立的一种标准I/O模型,是一种标准函数包和stdio.h头文件中的定义,具有一定的可移植性。(标准库封装)
    2.  标准I/O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构。    
        文件I/O一般没有采用缓冲模式,需要自己创建缓冲区。
    3.  所有I/O函数都是针对文件描述符的。当打开一个文件时,即返回一个文件描述符,然后该文件描述符就用于后续的I/O操作。
         而对于标准I/O库,它们的操作则是围绕流进行的。当用标准I/O库打开或创建一个文件时,我们已使用一个流与一个文件相关联。
    4.  标准的 C 库函数(标准io)建立在底层系统调用(文件io)之上,即 C 函数库文件访问函数的实现中使用了文件 I/O 系统调用。
       标准的 C 库中的文件处理函数为了减少使用系统调用的次数,提高效率,根据应用的不同,采用几种缓冲区机制,这样,在对磁盘文件进行读操作时,可以一次性地从文件中读出大量数据到缓冲区中,以后对这部分数据的访问就不需要再使用系统调用了。在对磁盘文件进行操作时,可以先将内容存储在文件缓冲区中,待文件缓冲区满后再用系统调用将该文件一次写入到磁盘。
    5.  标准io不能对设备进行操作;
        open()则可以
     
    ----------------------------------------------------------------------
    下面几个文件IO是不带缓存的IO。
    •open(),creat()函数是用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数
     •close()函数用于关闭一个被打开的文件,当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显式地关闭一个文件
    •read()函数用于将从指定的文件描述符中读出的数据放到缓存区中。
      返回实际读入的字节数。若返回0,则表示没有数据可读,即已达到文件尾。读操作从文件当前指针位置开始
     •write() 会把参数buf 所指的内存写入 count 个字节到参数 fd所指的文件内. 当然, 文件读写位置也会随之移动.  
      如果顺利write()会返回实际写入的字节数. 当有错误发生时则返回-1, 错误代码存入errno 中.
    •lseek()函数用于在指定的文件描述符中将文件指针定位到相应的位置。 
      只能用在可定位(可随机访问)文件操作中。
      管道、套接字和大部分字符设备文件是不可定位的,所以在这些文件的操作中无法使用lseek()调用。
      Linux 系统不允许lseek()对tty 装置作用, 此项动作会令lseek()返回ESPIPE。  
    。。。。。。。。
    再列举一些标准IO:
      FILE *fopen (__const char *__restrict __filename, __const char *__restrict __modes);
      int fclose (FILE *__stream);
      int fcloseall (void);
      int fflush (FILE *__stream);
        int fgetc (FILE *__stream);
      int getc (FILE *__stream);
      int getchar (void); //从标准输入设备读一个字符
      int fputc (int __c, FILE *__stream);//写字符 c 到流 stream 中
      int putc (int __c, FILE *__stream);
      int putchar (int __c); //写字符 c 到标准输出设备
      char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
      char *gets (char *__s);/此函数尽量不要使用,因为它对读出量没有限制
        int fputs (__const char *__restrict __s, FILE *__restrict __stream)
      int puts (__const char *__s); //输出流到标准出设备中
      size_t fread (void *__restrict __ptr, size_t __size, size_t __n, FILE*__restrict __stream)
      size_t fwrite (__const void *__restrict __ptr, size_t __size, size_t __n,FILE*__restrict __s)
      int feof(FILE * __stream)
      int ferror (FILE *__stream)
      void clearerr (FILE *__stream)  
      long int ftell (FILE *__stream)
      int fseek (FILE *__stream, long int __off, int __whence)
      void rewind (FILE *__stream)
      int fscanf (FILE *__restrict __stream, __const char *__restrict __format, ...)
      int fprintf (FILE *__restrict __stream, __const char *__restrict __format, ...)
    -----------------------------------------------------------
      int fileno(FILE *fp);
    注意:fileno不是ISO C标准部分,而是POSIX支持的扩展。
     
     
  • 相关阅读:
    MSSQL存储过程也玩“递归”
    呼之欲出 WebMail 开发手记 (二) 数据库与软件设计分析
    PageRequestManagerServerError
    呼之欲出 WebMail 开发手记 (七) 邮件发送
    呼之欲出 WebMail 开发手记 (四) 邮件收发准备
    呼之欲出 WebMail 开发手记 (六) 邮件收取
    增强 GridView 控件的功能 (二)
    VS.NET 2003 制作安装部署程序时遇到的问题
    android手机定位
    网络错误的基本处理
  • 原文地址:https://www.cnblogs.com/mylinux/p/3017947.html
Copyright © 2011-2022 走看看