- open

#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);    

功能:
   打开文件 
参数:
  @pathname --- 文件名 
  @flags 
        必选:
        O_RDONLY
        O_WRONLY
        O_RDWR
        附加:
        O_APPEND //追加 ---写 
        O_CREAT  //创建 
        O_TRUNC  //截断 
  @mode
       表示创建文件的权限 --- 只有前面有O_CREAT时,才需要指定 
       0777
       0666
返回值:
   成功 返回文件描述符 
   失败 -1 &&errno 
   

fopen("1.txt", "r")  ---> open("1.txt",O_RDONLY);
fopen("1.txt","r+")  ---> open("1.txt",O_RDWR);
fopen("1.txt", "w")  ---> open("1.txt",O_WRONLY|O_CREAT|O_TRUNC,0666);
fopen("1.txt","w+")  ---> open("1.txt",O_RDWR|O_CREAT|O_TRUNC, 0666);
fopen("1.txt", "a")  ---> open("1.txt",O_WRONLY|O_APPEND|O_CREAT, 0666);
fopen("1.txt","a+")  ---> open("1.txt",O_RDWR|O_APPEND|O_CREAT, 0666);

//流指针  <---->  文件描述符  
stdin              0
stdout             1
stderr             2


实际的文件权限:
      - rw- r-- r-- 
           110 100 100
        6   4   4 
        
        
        mode & ~umask 
        
        110 110 110 mode 
        000 010 010 umask 
        111 101 101 ~umask 
        
        110 110 110 mode 
    &   111 101 101 ~umask 
   -----------------
        110 100 100 //644
        
        
 ssize_t read(int fd, void *buf, size_t count);
功能:
    从fd对应文件中读取数据,读count个字节,存放到buf指定的一块空间 
参数:
  @fd    就是要读取的文件 
  @buf   存放数据的空间 
  @count 要读取的字节数
返回值;
   成功 读取到的字节数 
   失败 -1 &&errno 
练习:
   cat //open + read 


   
注意:
   read读到的数据,如果要当作字符串处理,
   注意,需要手动处理成字符串 
ssize_t write(int fd, const void *buf, size_t count);
 功能:
    从buf中获得数据,写count个字节到 fd对应文件中
参数:
  @fd    就是要写的文件 
  @buf   存放数据的空间 
  @count 要写入的字节数
返回值;
   成功 写入的字节数 
   失败 -1 &&errno  

练习:
  用read 和 write实现文件拷贝 


  
lseek

off_t lseek(int fd, off_t offset, int whence);
功能:
     将fd定位到从whence开始的offset的位置 
参数:
    @fd 文件 
    @offset 偏移量 
    @offset   --- 偏移量 
            >0   //需要考虑参考点是否可以 
            <0 
    @whence   --- 参考点 
            SEEK_SET  //文件开头 
            SEEK_CUR  //文件当前位置 
            SEEK_END  //文件结尾
            
定位开头:
   lseek(fd,0,SEEK_SET);
定位到末尾
   lseek(fd,0,SEEK_END);
   
返回值:
   成功 返回从文库开头到当前定位处的偏移量 
   失败 -1 && errno 
   
 //获得文件大小 
 off_t len = lseek(fd,0,SEEK_END); //off_t //long int型 

 创建空洞:
   1.定位 
   2.写操作 
     write   
练习:
    输入一个文件,创建一个 同样大小的空洞文件 
  

功能:
   统计行数 
   
   fgets 
   
   日志 
   fd = open
   
   read
     fgets(fp);
     fprintf()
   write
   
   标准IO --- FILE * fp
   文件IO --- fd 
   
   
   FILE *fp ---> fd 
   
   int fileno(FILE *stream); //将FILE *fp 流指针转换为 fd 
   fd ---> FILE *fp 
    FILE *fdopen(int fd, const char *mode);
    功能:
      将 fd 对应文件打开 关联一个 FILE * 指针 
      
  
  fd =  open("1.txt",O_RDONLY);
  
  fdopen(fd,"r+");

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐