您的位置:首页 > 运维架构 > Linux

Linux/Unix C编程之系统函数文件读写 学习笔记

2013-07-15 23:26 811 查看
  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将结构体转换成字符串的形式写入文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: