文件操作函数头文件有以下几个:
# include<sys/types.h>
# include<sys/stat.h>
# include<fcntl.h>
(1)int open(const char *filename,int flag,int mode); //打开文件
返回值:<0,表示出错了;>=0,表示文件描述符(fd),在read,write,close,lseek函数中使用。
filename:打开的文件名(如果只给文件名,只会去当前目录下搜索,如果要打开一个指定的文件,就要给出它的路径)
flag:打开的方式(只读:O_RDONLY、只写:O_WRONLY、读写:O_RDWR、追加:O_APPEND,创建:O_CREAT)
注意:如果文件存在,那么加了这个选项就没有什么效果,因为有它就不会再去新建。如果打开的文件不存在,我设置了这个参数,那我就会去创建一个新的文件,如果没有这个参数,那就会打开失败,给我们报错,一般返回的都是-1。
mode:这个参数是个可选项,只有在flag为O_CREAT时才会用到。它的作用是创建文件时,指定文件的权限,权限用nnnn表示,一般第一个n都为0。
(2)int read(int fd,void *buf,size_t size); //读文件
fd:读取的文件,由open的返回值指定
buf:存储缓冲区,就是从文件读到的数据存放的位置
size:指定一次最多读取的字节个数,一般情况下是缓冲区的大小(可以小于缓冲区的大小,不能大于缓冲区的大小,因为比缓冲区大存储时就会越界)。
返回值:出错返回-1;成功返回读到的数据字节数
(3)int write(int fd,void *buf,size_t size); //写文件
返回值:出错返回-1;成功返回写入的数据的长度(字节)
注意:如果写入到一半出错了,就会将已经写入成功的数据字节数返回
fd:写入的对象(open打开的文件)
buf:写入的数据的起始位置
size:写入数据的长度(按字节计算)
例如:char buff[128]="hello world";
write(fd,buff,strlen(buff));
(4)int close(int fd); //关闭打开的文件
fd:指定文件描述符
返回值:成功返回0;失败返回-1
(5)int lseek(int fd,int size,int flag); //移动读写偏移量,相当于c语言中的读写游标,就是类似于有这么一个指针来记录当前操作的位置,比如:这个值前面的都是操作过的,这个值后面的都是未操作的。
fd:操作的文件
size:移动的大小(字节)
flag:移动标记,移动的起始位置:SEEK_SET(文件的开头),SEEK_CUR(文件的当前位置),SEEK_END(文件的结尾)
(6) int stat(const char *filename, struct stat *buf); //通过文件名filename获取文件信息,并保存在buf所指的结构体stat中
int fstat(int fd,struct stat *buf); //fstat 通过文件描述符获取文件对应的属性。文件打开后这样操作
int lstat(const char *filename,struct stat *buf); //连接文件
返回值:执行成功则返回0,失败返回-1
给定一个pathname,stat函数返回一个与此命名文件有关的信息结构,fstat函数获得已在描述符filedes上打开的文件的有关信息。lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。
文件对应的属性:
struct stat {
mode_t st_mode; //文件对应的模式,文件,目录等
ino_t st_ino; //inode节点号
dev_t st_dev; //设备号码
dev_t st_rdev; //特殊设备号码
nlink_t st_nlink; //文件的连接数
uid_t st_uid; //文件所有者
gid_t st_gid; //文件所有者对应的组
off_t st_size; //普通文件,对应的文件字节数
time_t st_atime; //文件最后被访问的时间
time_t st_mtime; //文件内容最后被修改的时间
time_t st_ctime; //文件状态改变时间
blksize_t st_blksize; //文件内容对应的块大小
blkcnt_t st_blocks; //文件内容对应的块数量
};