Linux 操作系统中,open 函数是一个 Linux 系统调用,用于打开一个文件或者创建一个新文件 ,加上配合write() 和 read() 函数的使用来方便我们对文件的读写操作,下面我们来看看他们的作用以及函数原型:
open()函数:
int open(const char *pathname, int flags, mode_t mode);
其中,pathname 参数是要打开或创建的文件的路径:
文件路径名(绝对路径)或者文件名
flags 参数指定文件访问模式和打开方式:
只读:O_RDONLY 、只写:O_WRONLY、可读可写:O_RDWR
我们可以与上另外一些可选常量,使用不同的功能函数:如
O_RDWR | O_CREAT:可读可写且当打开这个文件时,该文件不存在则创建它
O_CREAT:当打开这个文件时,该文件不存在则创建它,需要搭配第三个参数使用
O_APPEND:每次往这个文件写新的内容时,新的内容总是加到文件的末端即打开文件后进行写操作时(调用write()),若该文件原先有内容,则不会覆盖原来的内容,而是在末端添加内容
O_TRUNC:清空原本的内容
O_EXCL:若同时与上该常量与 O_CREAT,当需要打开的文件存在时,open()会返回一个整型数-1
mode_t mode:参数是新创建文件的访问权限,该函数返回一个整型的文件描述符,表示打开文件的位置。如果打开文件失败,则返回一个负数。
可读 r: 4
可写 w: 2
执行 x: 1
默认值:0???;
如:

-rwx:可读可写可执行 (8421法转换数值)(0700)
-rw- :可读可写(8421法转换数值)(0600)(一般情况下默认)
open函数执行代码:(打开\创建)

运行结果:

(有该文件则显示成功,如果没有则先显示打开失败,然后创建该文件,fd返回3则代表打开成功)
write()函数:
ssize_t write(int fd, const void *buf, size_t count);
其中 fd 是文件描述符:
使用open()时返回的文件描述符
buf 是要写入的数据缓冲区:
内存,一般传内存地址,如数组名,指针名
count 是要写入的字节数:
写入字节数
write函数执行代码:(写入)

运行结果:


read()函数:
ssize_t read(int fd, void *buf, size_t count);
其中 fd 是文件描述符:
使用open()时返回的文件描述符
buf 是读取的数据缓冲区:
内存,一般传内存地址,如数组名,指针名
count 是要读取的字节数:
读取字节数
两个函数均返回实际读写字节数,读写失败返回-1
read函数执行代码:(写入)

运行结果:

(从file2文件中读取到15个字节,并打印出来)
其中整体代码有优化的地方,以及细节如下:
将原本的open操作来改变光标位置,替换成lseek()函数,其原型为:
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符
offset:偏移量
whence:位置
SEEK_SET:为0时表示文件开始位置。
SEEK_CUR:为0时表示当前位置。
SEEK_END:为0时表示结尾位置
函数返回值:成功返回当前位置到开始的长度、失败返回-1并设置errno
修改如下:

完整代码示例:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char *buf = "Ivan hen shuai!";//要写入的字符串
fd = open("./file2",O_RDWR);
if(fd == -1){
printf("open file2 fail\n");
fd = open("./file2",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("create file2 susceess!");
}
}
printf("open susceess! fd = %d\n",fd);
/*以上为打开操作*/
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write = %d byte to file2\n",n_write);//将写入内容打印
}
/*以上为写入操作*/
char *read_buf;
read_buf = (char*)malloc(sizeof (char)* n_write + 1);
lseek(fd,0,SEEK_SET);
int n_read = read(fd,read_buf,n_write);
/*以上为读取操作*/
printf("read = %d,context = %s\n",n_read,read_buf);//将读取内容打印
close(fd);//关闭文件,将动态内存上传至静态文件
return 0;
}
作者:Ivan