文档操作open,read,wirte,lseek,stat,lstat

    1. open函数的定义和参数
      我们首先来看下open函数在Linux下的定义:

      //需要使用到的头文件
      #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);

       


      头文件:
      如上所示,我们在使用open函数时候需要添加的头文件是

      #include <sys/types.h>//这里提供类型pid_t和size_t的定义
      #include <sys/stat.h>
      #include <fcntl.h>

      返回值
      open函数的返回值如果操作成功,它将返回一个文件描述符,如果操作失败,它将返回-1。

      参数含义:
      1、pathname:
      在open函数中第一个参数pathname是指向想要打开的文件路径名,或者文件名。我们需要注意的是,这个路径名是绝对路径名。要是直接给文档名称,文档名则是在当前路径下的。

      2、flags:
      flags参数表示打开文件所采用的操作,我们需要注意的是:必须指定以下三个常量的一种,且只允许指定一个

      O_RDONLY:只读模式
      O_WRONLY:只写模式
      O_RDWR:可读可写
      以下的常量是选用的,这些选项是用来和上面的必选项进行按位或起来作为flags参数。

      O_APPEND 表示追加,如果原来文件里面有内容,则这次写入会写在文件的最末尾。
      O_CREAT 表示如果指定文件不存在,则创建这个文件
      O_EXCL 表示如果要创建的文件已存在,则出错,同时返回 -1,并且修改 errno 的值。
      O_TRUNC 表示截断,如果文件存在,并且以只写、读写方式打开,则将其长度截断为0。
      O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
      O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)
      以下三个常量同样是选用的,它们用于同步输入输出

      O_DSYNC 等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
      O_RSYNC read 等待所有写入同一区域的写操作完成后再进行
      O_SYNC 等待物理 I/O 结束后再 write,包括更新文件属性的 I/O
      3、mode:
      mode参数表示设置文件访问权限的初始值,和用户掩码umask有关,比如0644表示-rw-r–r–,也可以用S_IRUSR、S_IWUSR等宏定义按位或起来表示,详见open(2)的Man Page。要注意的是,有以下几点

      文件权限由open的mode参数和当前进程的umask掩码共同决定。
      第三个参数是在第二个参数中有O_CREAT时才作用,如果没有,则第三个参数可以忽略

    2. read函数:
      #include <unistd.h>
      
      ssize_t read(int fd, void *buf, size_t count);

      头文件:
      包含的头文件为unistd.h
      返回值:
      >0:表示返回读到buff的长度
      =0:表示读到了最后一个元素,应该结束了
      -1:表示没有读到fd所指的文件
      参数:
      fd:需要读取的文件的描述符
      buff:要把读取的数据放入到这个buff中
      count:一次性读取多少的字符到buff,一般用sizeof(buff)

    3. wirte
      #include <unistd.h>
      ssize_t  write(int fd, const void *buf,size_t count);

      可以配合read使用,看一下的拷贝过程就知道了:

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <fcntl.h>
      #include<stdio.h>
      #include <unistd.h>
      
      int main(){
      //打开需要拷贝的文件
      int srcfd = open("a.txt",O_RDONLY); if(srcfd==-1){ perror("open"); return -1; } //创建一个新的文件(也就是拷贝到那里去) int desfd = open("copy.txt",O_WRONLY|O_CREAT,0664); if(desfd==-1){ perror("open"); return -2; }
      //建立一个缓冲区
      char buff[1024]={0}; int len;
      //读取拷贝文件的数据,将其拷贝到创建的新文件"copy.txt"
      while((len=read(srcfd,buff,sizeof(buff)))){ write(desfd,buff,len); }
      //关闭两个描述符,释放这两个描述符,因为描述符数组的大小是一定的 close(desfd); close(srcfd);
      return 0; }

       

      1. lseek函数:

      lseek函数用于设置文件偏移量。

      每个打开的文件都有一个与其相关联的“当前文件偏移量”(current file offset)。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读写操作都从当前文件偏移量处开始,并使偏移量增加所读写的字节数。按系统默认的情况,当打开一个文件时,除非制定O_APPEND选项,否则该偏移量被设置为0。

      #include<unistd.h>
      off_t lseek(int filedes, off_t offset, int whence);

      对参数offset 的解释与参数whence的值有关。

      1. 若whence是SEEK_SET,则文件偏移量设置为距文件开始处 offset个字节。
      2. 若whence是SEEK_CUR,则文件偏移量设置为当前值加 offset,offset可为正或负。
      3. 若whence是SEEK_END,则文件偏移量设置为文件长度加 offset,offset可为正或负。

      若lseek成功执行,则返回新的文件偏移量,为此可以用下列方式确定打开文件的当前偏移量:

      off_t   currpos;
      currpos = lseek(fd, 0,SEEK_CUR);

      这种方法也可用来确定所涉及的文件是否可以设置偏移量。如果文件描述符引用的是一个管道,FIFO或网络套接字,则lseek返回 -1,并将errno设置为ESPIPE。

        lseek函数的一般作用:


      作用1:lseek(fd,0,SEEK_SET);//移动文件指针到文件头
      
      
      作用2:lseek(fd,0,SEEK_CUR);//返回现在文件只指针的位置
      
      作用3:lseek(fd,0,SEEK_END);//返回现在文件的大小
      作用3:lseek(fd,100,SEEK_END);//将文件的大小往下扩容100b

       

    4. stat函数:

      /*
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <unistd.h>

      int stat(const char *pathname, struct stat *statbuf);
      作用:获取一个文件相关的一些信息
      参数:
      - pathname:操作的文件的路径
      - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
      返回值:
      成功:返回0
      失败:返回-1 设置errno

      int lstat(const char *pathname, struct stat *statbuf);
      参数:
      - pathname:操作的文件的路径
      - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
      返回值:
      成功:返回0
      失败:返回-1 设置errno

      */

      #include <sys/types.h>
      #include <sys/stat.h>
      #include <unistd.h>
      #include <stdio.h>
      
      int main() {
      
      struct stat statbuf;
      
      int ret = stat("a.txt", &statbuf);
      
      if(ret == -1) {
      perror("stat");
      return -1;
      }
      
      printf("size: %ld\n", statbuf.st_size);
      
      
      return 0;
      }

       

 

posted @ 2022-10-02 16:53  铜锣湾陈昊男  阅读(52)  评论(0)    收藏  举报