zoukankan      html  css  js  c++  java
  • Linux/Unix C编程之系统函数文件读写 学习笔记

      linux 自带函数库中的文件读写函数open/read/write/close    

      open/read/write/close和C语言的文件读写函数fopen/fread/fwrite/fclose有一些不同,不过整体相差不大

      open/read/write/close 操作的对象是文件描述符,而fopen/fread/fwrite/fclose操作的对象时内存中的文件流

      文件描述符:        

      Unix/Linux打开文件时,会把文件相关信息 存入文件表中。        

      每个文件表 都有int类型的编号,一个文件表可以有多个编号 ,这个编号就是文件描述符。

        文件描述符 是非负整数(0开始),因此-1 代表错误    

      文件描述符 0 1 2 默认被系统占用,代表标准输入 标准输出 和标准错误    

      文件描述符 从3开始 到OPEN_MAX(同时打开文件的最大值)    

      open函数返回一个新的文件描述符,新的描述符应该是未使用的,描述符的最小值

    1.open(char* filename,int flags,...)        

      filename - 文件名(包括格式后缀)        

      flag - O_RDONLY(只读)               

         O_WRONLY(只写)               

         O_RDWR(读写)               

         O_CREAT(创建,在没有file,需要创建时要加O_CREAT)               

         O_TRUNC(清空已经存在文件的内容)               

         O_APPEND(追加)               

         open的第三个参数是文件的权限,只有在新建文件时需要指定,3位8进制        

         例如 0777代表着当前用户的权限是7(读4,写2,执行1),该用户所属的群组权限7,其他用户对该文件的权限7

         可用|位或链接多个权限,如int fd = open("./open.txt",O_RDWR | O_CREAT,0666);

         如果打开成功,返回文件的文件描述符,失败返回 -1

    write/read    

      read(fd,buf,size);    

      write(fd,buf,size);    

      第一个参数fd,第二个参数读/写的首地址,第三个参数要读/写的字节数    

      read/write返回值是 实际读到/写入字节数,-1代表错误    

      注:    

      打开一次文件,用写入数据之后,如果想再读出来,这时候需要用lseek函数将文件 表的偏移量,定位到要读的数据的前面    

      当再次打开一个文件的时候,如果需要不覆盖之前的数据写入新的数据的话,打开 文件时需要加O_APPEND。

      即     int fd = open("xxx.xx",O_RDWR | APPEND);

    将一个结构体写入文件,并再读出来,然后打印 ========================================================================== #include<stdio.h> #include<stdlib.h>

    #include<fcntl.h>

    #include<unistd.h> /*定义一个student的结构体,并将结构体重定义为Student*/

    typedef struct student{    

      int id;    

      char name[20];

    }Student;

    int main(){     /*新建student.txt,并将一个学生的信息写入student.txt*/    

      int fd = open("student.txt",O_CREAT | O_RDWR , 0666);    

      if(fd == -1){        

        perror("open");        

        exit(-1);    

      }    

      Student st_w = {130713,"Redhat"};    

       write(fd,&st_w,sizeof(Student));     /*当一个学生信息写入之后,当前文件的偏移量会偏移到sizeof(Student)    

      *如果想再读取,需用lseek将文件的偏移量重置到文件开头     */    

      lseek(fd,0,SEEK_SET);    

      Student st_r = {};    

      read(fd,&st_r,sizeof(Student));    

      printf("id:%d ame:%s ",st_r.id,st_r.name);    

      close(fd);

      return 0;

    }

    ============================================================================

    cat student.txt会发现有乱码,可以用sprintf将结构体转换成字符串的形式写入文件

  • 相关阅读:
    【Beta阶段】第六次scrum meeting
    【Beta阶段】第五次scrum meeting
    【Beta阶段】第四次scrum meeting
    【Beta阶段】第三次scrum meeting
    【Beta阶段】第二次scrum meeting
    团队作业4——第一次项目冲刺(Alpha版本) 日志集合处
    团队作业10——Beta版本事后诸葛亮
    Beta阶段项目复审
    团队作业9——展示博客(Beta版本)
    团队作业9——测试与发布(Beta版本)
  • 原文地址:https://www.cnblogs.com/spring-1991/p/3192420.html
Copyright © 2011-2022 走看看