zoukankan      html  css  js  c++  java
  • 文件操作(Linux系统调用)

    1.创建文件
    int creat(const char *filename, mode_t mode)
    filename:要创建的文件名(包含路径,缺省为当前路径)
    mode:创建的文件的模式/访问权限
    常见模式:
    S_IRUSR 可读
    S_IWUSR 可写
    S_IXUSR 可执行
    S_IRWXU 可读、可写、可执行
    还可以直接使用数字来表示文件的访问权限:
    可执行 1
    可写 2
    可读 4
    上述三个值的和,如可读可写可执行 7(1+2+4)
    无任何权限 0

     1 #include <stdio.h> 
     2 #include <stdlib.h> 
     3 
     4 #include <sys/types.h> 
     5 #include <sys/stat.h> 
     6 #include <fcntl.h> 
     7 
     8  void  create_file(char *filename){ 
     9 
    10 /*创建的文件的属性0755表示:
    11 文件所有者可读可写可执行;
    12 文件所有者所在组用户可读可执行;
    13 其他用户可读可执行*/
    14     if(creat(filename,0755)<0){ 
    15         printf("create file %s failure!
    ",filename); 
    16         exit(EXIT_FAILURE); 
    17     }else{ 
    18         printf("create file %s success!
    ",filename); 
    19     } 
    20 } 
    21 
    22 int main(int argc,char *argv[]){ 
    23     int i; 
    24     if(argc<2){ 
    25         perror("you haven't input the filename,please try again!
    "); 
    26         exit(EXIT_FAILURE); 
    27     } 
    28 
    29     for(i=1;i<argc;i++){ 
    30         create_file(argv[i]);    
    31     } 
    32 
    33     exit(EXIT_SUCCESS); 
    34 }
    2.打开文件
    int open(const char *pathname, int flags)
    int open(const char *pathname, int flags, mode_t mode)
    常见打开标志(flags):
    O_RDONLY 只读方式打开
    O_WRONLY 只写方式打开
    O_RDWR 读写方式打开
    O_APPEND 追加方式打开
    O_CREATE 创建一个文件
    O_NOBLOCK 非阻塞方式打开
    如果使用了O_CREATE标志,则必须指定mode来表示文件的访问权限。
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 #include <sys/types.h>
     5 #include <sys/stat.h>
     6 #include <fcntl.h>
     7 
     8 int main(int argc ,char *argv[]){
     9     int fd;
    10     if(argc<2){
    11         puts("please input the open file pathname!
    ");
    12         exit(1);
    13     }
    14     
    15     //如果flag参数里有O_CREAT表示,该文件如果不存在,系统则会创建该文件,该文件的权限由第三个参数决定,此处为0755
    16     //如果flah参数里没有O_CREAT参数,则第三个参数不起作用.此时,如果要打开的文件不存在,则会报错.
    17     //所以fd=open(argv[1],O_RDWR),仅仅只是打开指定文件
    18     if((fd=open(argv[1],O_CREAT|O_RDWR,0755))<0){
    19         perror("open file failure!
    ");
    20         exit(1);
    21     }else{
    22         printf("open file %d  success!
    ",fd);
    23 
    24     }
    25     close(fd);
    26     exit(0);
    27     
    28 }
    3.关闭文件
    int close(int fd)
    fd:文件描述符(一个非负整数)
    4.读文件
    int read(int fd, const void *buf, size_t length)
    从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回实际读取的字节数。
    5.写文件
    int write(int fd, const void *buf, size_t length)
    把buf所指向的缓冲区中的length个字节写到文件描述符fd所指向的文件中,返回实际写入的字节数。
    6.定位文件(移动文件指针)
    int lseek(int fd, offset_t offset, int whence)
    将文件读写指针相对whence移动offset个字节。操作成功,则返回文件指针相对于文件头的位置。
    whence可以取下述值:
    SEEK_SET:相对文件开头
    SEEK_CUR:相对文件读写指针的当前位置
    SEEK_END:相对文件末尾
    offset可取负值,表示向前移动。
    7.访问权限判断
    int access(const char *pathname, int mode)
    pathname:文件名称
    mode:要判断的访问权限,可以取下面的值或者它们的组合。R_OK:文件可读,W_OK:文件可写,X_OK:文件可执行,F_OK:文件存在。
    返回值:当我们测试成功时,函数返回0,否则如果有一个条件不符合,返回-1。
     1 #include <sys/types.h>
     2 #include <sys/stat.h>
     3 #include <fcntl.h>
     4 #include <stdio.h>
     5 #include <errno.h> 
     6 
     7 #define BUFFER_SIZE 1024 
     8 
     9 int main(int argc,char **argv) 
    10 { 
    11   int from_fd,to_fd; 
    12   int bytes_read,bytes_write; 
    13   char buffer[BUFFER_SIZE]; 
    14   char *ptr; 
    15 
    16   if(argc!=3) 
    17   { 
    18     fprintf(stderr,"Usage:%s fromfile tofile/n/a",argv[0]); 
    19     exit(1); 
    20   } 
    21 
    22   /* 打开源文件 */ 
    23   if((from_fd=open(argv[1],O_RDONLY))==-1) 
    24   { 
    25     fprintf(stderr,"Open %s Error:%s/n",argv[1],strerror(errno)); 
    26     exit(1); 
    27   } 
    28 
    29   /* 创建目的文件 */
    30   if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1) 
    31   { 
    32     fprintf(stderr,"Open %s Error:%s/n",argv[2],strerror(errno)); 
    33     exit(1); 
    34   }
    35 
    36   /* 以下代码是一个经典的拷贝文件的代码 */ 
    37   while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)) 
    38   {
    39     /* 一个致命的错误发生了 */ 
    40     if((bytes_read==-1)&&(errno!=EINTR)) break; 
    41     else if(bytes_read>0) 
    42     { 
    43       ptr=buffer; 
    44       while(bytes_write=write(to_fd,ptr,bytes_read)) 
    45       { 
    46         /* 一个致命错误发生了 */ 
    47         if((bytes_write==-1)&&(errno!=EINTR))break; 
    48         /* 写完了所有读的字节 */ 
    49         else if(bytes_write==bytes_read) break; 
    50         /* 只写了一部分,继续写 */ 
    51         else if(bytes_write>0) 
    52         { 
    53           ptr+=bytes_write; 
    54           bytes_read-=bytes_write; 
    55         } 
    56       } 
    57       /* 写的时候发生的致命错误 */ 
    58       if(bytes_write==-1)break; 
    59     } 
    60   } 
    61   close(from_fd); 
    62   close(to_fd); 
    63   exit(0); 
    64 }
  • 相关阅读:
    1040 最大公约数之和(欧拉函数)
    1028 大数乘法 V2(FFT or py)
    1020 逆序排列(DP)
    1837 砝码称重
    1070 Bash游戏 V4
    1280 前缀后缀集合(map)
    1390 游戏得分(贪心)
    1179 最大的最大公约数
    1400 序列分解(dfs)
    1420 数袋鼠好有趣(贪心二分)
  • 原文地址:https://www.cnblogs.com/yuanshuang/p/5582961.html
Copyright © 2011-2022 走看看