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将结构体转换成字符串的形式写入文件