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\name:%s\n",st_r.id,st_r.name);    

  close(fd);

  return 0;

}

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

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

posted @ 2013-07-15 23:26  SpringJiang  阅读(453)  评论(0编辑  收藏  举报