这里写目录标题
文件=文件内容+文件属性
文件操作=文件内容操作+文件属性操作
代码变成进程,调用f系列函数操作文件
当前路径:当前进程的工作路径,进程启动后,自己的路径会被保存在PCB中
向文件写入数据,最终是向磁盘写入,磁盘是硬件,只能通过操作系统提供的函数去访问硬件
位图,通过传标志位,执行不同的功能,每一位代表一个功能
C语言中的文件操作接口:
fopen:
打开文件没有带路径,默认在当前路径下形成
w打开文件,会先将文件清空,再写入
fread:
fwrite:
fseek:移动文件流指针指向的位置
whence的三个常用取值
SEEK_SET | 定义文件流指针到文件头部 |
---|---|
SEEK_CUR | 定义文件流指针到当前位置 |
SEEK_END | 定义文件流指针到文件末尾 |
fclose:
fclose(FILE* stream)
现象:屏幕上什么都没有输出
原因:当前文件流指针指向了文件末尾
- 刚开始写文件调用fwrite,文件流指针指向文件头部;
- 写完 “i am biter\0” 后,此时文件流指针指向当前文件的末尾位置;
- 调用fread读取时,是从文件末尾读取的,所以读不到任何内容;
所以在读取前要使用fseek函数重置文件流指针位置
系统调用的文件操作接口:
C语言中,以w方式打开文件,文件会被清空
open:
必选项:下列三种方式必须有且只有一个
O_RDONLY | read只读 |
---|---|
O_WRONLY | write只写 |
O_RDWR | read write读写 |
可选项:
O_TRUNC | 截断(清空)文件 |
---|---|
O_CREAT | 文件不存在则创建 |
O_APPEND | 追加方式 |
O_EXECL | 与CREAT搭配使用 |
这两个选项各自自由组合,就形成类似C语言中的w,r,a等选项
使用:
- O_ECLE | O_CREAT;
如果文件存在则打开失败,就是不想重新创建文件- 可选项和必选项组合使用,用按位或 | 方式组合
(本质上内核使用位图的方式来表示每一种方式的,后面说)
例:
- O_RDWR | O_CREAT | O_APPEND
- 打开文件可读可写,文件不存在则创建,文件存在则追加
打开文件前,最好更新一下umask的值,然后设置文件权限
read:
返回值是ssize_t
write:
lseek:
close:
close(int fd);
关闭文件描述符
使用
ll/proc/进程号/fd
命令查看进程打开的文件信息,打印出文件描述符的值是3
- 命令行启动一个可执行程序时,会默认打开三个文件描述符;
- 这三个文件描述符分别对应标准输入,标准输出,标准错误(可以理解为运行该程序需要的文件);
- 0:标准输入
1:标准输出
2:标准错误
3:默认新打开文件的文件描述符
为什么在读操作时要-1:
-1是预留\0的位置,防止访问越界;
- buf里有1024个字节的空间,然后每次从文件中去读1023个字节;
- 如果该文件中有大量文件读取,我们每次取1024个字节到数组中去放入数组;此前所有操作都没有问题;
- 但是字符串需要\0结束,不然read函数会一种读取直到遇见\0停止,所以要预留一个空间防止越界访问