linux中常用文件操作调用系统

来源:互联网 发布:hr绿宝瓶面霜 知乎 编辑:程序博客网 时间:2024/06/09 20:03
1.文件操作
[1].打开
[2].读写 -- 文件的定位
[3].关闭

程序实现方式 两种

[1].库函数 (stdio)
[2].系统调用(文件IO的内容)


stdio:
1.打开  fopen
2.读写
       fgetc fputc
       fgets fputs    ---- 定位 : fseek ftell rewind
       fread fwrite
3.关闭
       fclose

标准IO的操作对象是:
      FILE *fp <---流-->文件
      (流指针)


文件iO的操作对象:
      文件描述符<-------->文件

文件描述符:
[1].是一个非负的数值(>=0)
[2].文件描述符用来标示一个"已打开的文件"
[3].文件描述符的分配的原则:
    最小未使用
[4].系统默认已经打开了三个文件,这个三个文件
      stdin  stdout  stderr
         0     1      2
    
--------------------------------------------
文件IO:
[1].打开 -- open
[2].读写 -- read/write
[3].关闭 -- close

-----------------------------
[1].打开 -- open
    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_EXCL    //与 O_CREAT连用 ,可以实现对已存在文件的探测
                  O_TRUNC   //截短成0
                   
        @mode     指定打开的文件的权限(0666) (当 flags中有 O_CREAT 标志时 ,则需要制定这个权限)
   返回值:
       成功 文件描述符
       失败 -1&errno


   标准IO                       文件IO
-------------------------------------------------
    r                          O_RDONLY
    r+                         O_RDWR

    w                          O_WRONLY|O_CREAT|O_TRUNC , 0666  
    w+                         O_RDWR  |O_CREAT|O_TRUNC , 0666

    a                          O_WRONLY|O_APPEND|O_CREAT, 0666
    a+                         O_RDWR  |O_APPEND|O_CREAT, 0666          

注:
  linux 中 一切皆文件 思想
  [1].操作系统角度
      把接入到系统中的设备当做文件对待
  [2].编程角度
      类似文件的操作流程(a.打开 b.读写 c.关闭)

练习:
  使用open函数实现文件创建
  类似touch的功能;
  之后查看文件的权限
  ls -l hello.c

  -rw- rw- r-- 1 ubuntu ubuntu 199 Jun 12 20:40 hello.c
 
    4  2  1
    r  w  x        ----> 111 (二进制) --> 7(八进制)
   读 写  可执行            
                   6(八进制) ---> 110 -->rw 权限


文件掩码(掩码 就是使某些位 有效,某些位无效):
0666 & (~umask)

             110  110  110
0002    ---> 111  111  101 &
            ---------------
             110  110  100
             6     6    4

[2].读写 -- read/write (数据流向)
    ssize_t read (int fd,       void *buf, size_t count);
    ssize_t write(int fd, const void *buf, size_t count);
    参数:
        @fd   文件对应的描述符
        @buf  保存数据的内存首地址
        @count 表示一次期望操作的字节数
    返回值:
        成功 表示成功操作到的字节数
        失败 -1 & errno
            0 读:表示文件末尾
              写:表示没有任何数据写入


    读写过程中:
     定位
     lseek(); //off_t ==> long int数值
     off_t lseek(int fd, off_t offset, int whence);
     参数:
        @fd     要定位的文件
        @offset 文件偏移量
        @whence 相对的偏移起点
                SEEK_SET //文件的开头
                SEEK_CUR //文件的当前位置
                SEEK_END //文件的末尾

     返回值:
        成功 返回从文件开头到偏移位置的偏移量
        失败 -1 &errno

获得文件大小:
   long len ;
   len = lseek(fd,0,SEEK_END);


同样的,该函数也可以实现空洞文件的创建

创建空洞文件:
lseek(fd,len-1,SEEK_SET);
write(fd,"",1);//这里写入的数据是一个字符'\0'


[3].关闭 -- close
    int close(int fd);
练习:
   使用 文件io的函数,实现文件拷贝的功能

改进:
将拷贝程序实现成类似迅雷的方式

0 0
原创粉丝点击