前言
在文件I/O编辑中,我们常常用到open(),read(),write(),lseek()和close()函数,本文将深入简出地介绍这些函数的功能和参数。
一、open()函数
此函数用于创建或打开一个文件。它的返回值是一个非负整数,用于在内核中唯一标识一个打开的文件、设备或其他输入/输出资源。例如:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
int open(const char *pathname, int flags, mode_t mode);
//example
fd = open("test.text", O_WRONLY | O_CREAT, 0777);
fd1 = open("test.text",O_RDWR);
- pathname:要打开或创建的文件的路径名。
- flags:指定文件如何被打开或创建的文件状态标志。常用的标志有:
O_RDONLY:只读打开。
O_WRONLY:只写打开。
O_RDWR:读写打开。
O_CREAT:如果文件不存在则创建它。需要第三个参数指定权限。
O_TRUNC:如果文件已存在并且是以写方式打开的,则将其长度截断为0。
O_APPEND:每次写时都追加到文件的末尾。 … 以及其他标志。 - mode:如果使用了O_CREAT标志,这里需要传入一个mode_t类型的参数来指定新文件的权限,否则则可以省略mode只传输前两个参数即可。
- 返回值:成功时返回一个非负的文件描述符,失败时返回-1。
二、read()函数
此函数用于从打开的文件中读取数据。它接受文件描述符、缓冲区指针和要读取的字节数作为参数,并将读取的数据放入提供的缓冲区中。例如:
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//example
count = read(fd, buf, sizeof(buf));
- fd:文件描述符,通常由open()返回。
- buf:指向一个缓冲区的指针,用于存储读取的数据。
- count:要读取的字节数。
- 返回值:成功时返回读取的字节数,到达文件末尾或出错时返回小于count的值,出错时返回-1。
三、write()函数
此函数用于将数据写入打开的文件。它接受文件描述符、数据缓冲区指针和要写入的字节数作为参数,并将数据从缓冲区写入文件。
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
//example
count = write(fd, buf, count);
- fd:文件描述符。
- buf:指向包含要写入数据的缓冲区的指针。
- count:要写入的字节数。
- 返回值:成功时返回写入的字节数,出错时返回-1。
四、lseek()函数
此函数用于改变当前文件的读写位置。它允许你设置文件的偏移量,这样你可以在文件的任意位置开始读取或写入。
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
- fd:文件描述符。
- offset:相对于whence的偏移量。
- whence:确定偏移量的起始位置,可以是以下值之一:
SEEK_SET:从文件开始处计算偏移量。
SEEK_CUR:从当前读写位置计算偏移量。
SEEK_END:从文件末尾计算偏移量。 - 返回值:成功时返回新的文件偏移量(相对于文件开头的字节数),出错时返回-1。
五、close()函数
此函数用于关闭已打开的文件。在关闭文件后,你无法再对其进行读取或写入操作,并且系统资源会得到释放。
#include <unistd.h>
int close(int fd);
- fd:要关闭的文件描述符。
- 返回值:成功时返回0,出错时返回-1。