Linux系统中要操作一个文件需要先将其打开,从而获取文件描述符,相当于该文件的句柄,通过获取到的fd找到需要操作的文件从而进行相应的读写操作。
OPEN函数具有打开文件功能的同时也能创建一个新的文件。
/*open函数需要包含的头文件,可以通过“man 2 open”在命令行查看详情*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);//mode用于分类不同用户的权能
//第二条只在创建新文件时使用
pathname(path路径 name名称),通过const关键字标注的字符串类型,使其保持一定的稳定性。用于表示需要打开的文件或想要创建的文件的路径,绝对路径与相对路径都可。同时他也可以是一个符号链接,会对其进行解引用。
flags(标志),传入文件访问模式标志或者其他文件相关标志,这些标志原型是枚举体,具体内容可以查看手册。传入多个参数可以用 | 或标志进行组合。
O_RDONLY | read only 只读模式打开 | 必须传入的参数,而且必须三选一 |
O_WRONLY | write only 只写模式打开 | |
O_RDWR | read write 可读可写模式打开 | |
O_CREAT | create 如果文件不存在 则在pathname标识的地址创建文件 | 需要传入mode用于标识文件权限 |
O_DIRECTORY | directory (名址录)如果 pathname 参数指向的不是一个目录,则返回失败 | |
O_EXCL | 与O_CREAT结合使用,当文件不存在时创建文件,存在则返回错误 | 用于测试文件是否存在,这样可以兼顾测试和创建两个功能 |
O_NOFOLLOW | 如果 pathname 参数指向的是一个符号链接,则直接返回错误 | 不会再解析符号链接类型的pathname |
mode(运行方式),用于指定新建文件的访问权限,只有当 flags 参数中包含 O_CREAT 或 O_TMPFILE 标志时才有效。为000 000 000 000形式,类似chmod指令从后往前分别是其他用户、同组用户、文件所属者、文件特殊权限(这个位一般为0),000三位从前往后为读、写、执行。全部读写权可用0777来表示。
int fd = open("./text.c" , O_RDWR | O_CREAT | O_EXCL , 0777);
if(-1 == fd){
printf(“open error \n”);
return 1;
}
返回值:正常打开时返回一个非负整数,失败时返回-1。
write函数可向打开的文件写入数据。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd(文件描述符),open函数打开文件后可用获取。
buf,需要写入的内容,传入对应缓冲区。如“HELLO WORLD”
count,写入的字节数。
返回值,如果成功将返回写入的字节数,如果此数字小于 count 参数,可能是超出空间了,错误返回-1。
read函数可从打开的文件中读取数据
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd(文件描述符),open函数打开文件后可用获取。
buf,用于储存读取到的数据的缓冲区。
count,需要读取的字节数。
返回值,果读取成功将返回读取到的字节数,实际读取到的字节数可能会小count参数,可能是由于已经读取到文件末尾了,后续已经没有内容可以读取了。
close函数可关闭一个打开的文件
#include <unistd.h>
int close(int fd);
fd(文件描述符),open函数打开文件后可用获取。
返回值,如果成功返回 0,如果失败则返回-1。
lseek函数用于更变文件的读写偏移量。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd(文件描述符),open函数打开文件后可用获取。
offset, 偏移量,以字节为单位。
whence,用于定义参数 offset 偏移量对应的参照物。
SEEK_SET | 读写偏移量将指向 offset 字节位置处(从文件头部开始算) |
SEEK_CUR | 读写偏移量将指向当前位置偏移量 + offset 字节位置(offset是有符号数,可正可负) |
SEEK_END | 读写偏移量将指向文件末尾 + offset 字节位置(offset是有符号数,可正可负) |
返回值,成功将返回从文件头部开始算起的位置偏移量(字节为单位), 也就是当前的读写位置; 发生错误将返回-1。