文件io基础
本人学习记录自用
前言
文件 I/O 指的是对文件的输入/输出操作,说白了就是对文件的读写操作;Linux 下一切皆文件,文件作为 Linux 系统设计思想的核心理念,在 Linux 系统下显得尤为重要,所以对文件的 I/O 操作既是基础也是最重要的部分。
`提示:以下皆为个人学习如有错误敬请谅解
一、文件描述符是什么?
当调用 open 函数(或者可能会有其他函数)打开一个现有文件或创建一个新文件时,内核会向进程返回一个文件描述符,用于指代被打开的文件,所有执行 IO 操作的系统调用都是通过文件描述符来索引到对应的文件。当调用 read/write 函数进行文件读写时,会将文件描述符传送给 read/write 函数,fd1就是文件1对应的文件描述符,fd2就是文件2对应的文件描述符。一个进程可以打开多个文件描述符,但是也是有限制的,可以用ulimit -n命令来查看看进程可打开的最大文件数
```c
`/*`打开文件(只读方式)*/
fd1 = open("文件1", O_RDONLY);
if (-1 == fd1)
return fd1;
/* 打开文件 (只写方式) */
fd2 = open("文件2", O_WRONLY);
if (-1 == fd2) {
ret = fd2;
....................................
}
/* 读取源文件 1KB 数据到 buff 中 */
ret = read(fd1, buff, sizeof(buff));
if (-1 == ret)
...........................
/* 将 buff 中的数据写入目标文件 */
ret = write(fd2, buff, sizeof(buff));
if (-1 == ret)
..............................
.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);
pathname:字符串类型,用于标识需要打开或创建的文件,可以包含路径(绝对路径或相对路径)信
息,如果 pathname 是一个符号链接,会对其进行解引用。
flags:调用 open 函数时需要提供的标志,包括文件访问模式标志以及其它文件相关标志,这些标志使用宏定义进行描述,都是常量,open 函数提供了非常多的标志,我们传入 flags 参数时既可以单独使用某一个标志,也可以通过位或运算(|)将多个标志进行组合。
.write 写文件
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
fd:文件描述符。关于文件描述符,前面已经给大家进行了简单地讲解,这里不再重述!我们需要将进
行写操作的文件所对应的文件描述符传递给 write 函数。
buf:指定写入数据对应的缓冲区。
count:指定写入的字节数。
. read 读文件
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
fd:文件描述符。与 write 函数的 fd 参数意义相同。
buf:指定用于存储读取数据的缓冲区。
count:指定需要读取的字节数
如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于 count 参数指定的字节
数,也有可能会为 0,譬如进行读操作时,当前文件位置偏移量已经到了文件末尾。实际读取到的字节数少于要求读取的字节数,譬如在到达文件末尾之前有 30 个字节数据,而要求读取 100 个字节,则 read 读取成功只能返回 30;而下一次再调用 read 读,它将返回 0(文件末尾)。
. close 关闭文件
#include <unistd.h>
int close(int fd);
. lseek
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
fd:文件描述符。
offset:偏移量,以字节为单位。
whence:用于定义参数 offset 偏移量对应的参考值,该参数为下列其中一种(宏定义)
SEEK_SET:读写偏移量将指向 offset 字节位置处(从文件头部开始算)
SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset 字节位置处,offset 可以为正、也可以为
负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
SEEK_END:读写偏移量将指向文件末尾 + offset 字节位置处,同样 offset 可以为正、也可以为负,
如果是正数表示往后偏移、如果是负数则表示往前偏移。
返回值:成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1。