open函数
read函数
一 文件IO
1.1 什么是文件IO
所谓文件IO指的就是操作系统提供支持的API接口,以对文件的输入和输出
1.2 操作系统的分层
应用层
应用APP,bash脚本等
-----------------------------------
内核层
接收应用层发来的通知,去操作相应的硬件 (操作系统)
文件IO的接口都来自于内核层
-----------------------------------
硬件层
硬盘,鼠标,键盘,lcd,摄像头等
1.3 学习IO的前提
1> linux下一切皆文件
2> 文件IO是由操作系统提供的API接口,不同操作系统之间不通用
3> 由于文件IO直接由内核提供,所以效率比较高,但是频繁的调用
会极大的浪费CPU资源
4> linux :open write read
windows:_open _write _read
ios : Open Write Read
5> 文件描述符:是一个文件的代表,系统内部为结构体指针数组的下标
6> 文件描述符中:前三个已经被系统占用
0:标准输入 (从终端文件写入内存)
1:标准输出 (从内存输出到终端)
2:标准错误输出(从内存直接输出到终端)
7> errno:错误码(系统返回的错误码,其对应着一些错误原因)
错误原因可以使用perror函数进行打印
8> 文件掩码:umask
1.4 文件IO的五大函数(linux)
1> 打开文件 (open)
2> 写入文件 (write)
3> 读取文件 (read)
4> 操作文件读写指针 (lseek)
5> 关闭文件 (close)
1.5 man手册
下表显示了手册的 章节 号及其包含的手册页类型。
1 可执行程序或 shell 命令
2 系统调用(内核提供的函数)
3 库调用(程序库中的函数)
4 特殊文件(通常位于 /dev)
5 文件格式和规范,如 /etc/passwd
6 游戏
7 杂项(包括宏包和规范,如 man(7),groff(7))
8 系统管理命令(通常只针对 root 用户)
9 内核例程 [非标准]
1.6 文件IO的操作
【1】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:打开文件的路径+名称
flags :打开文件的方式(方式之间用|隔开)
以下必须三选一:
O_RDONLY: 以只读的方式打开文件
O_WRONLY: 以只写的方式打开文件
O_RDWR : 以读写的方式打开文件
可选项:
O_CREAT : 如果文件存在则直接打开,如果文件不存在则创建之
(如果加上O_CREAT,则必须加上第三个参数 mode)
O_APPEND: 以追加写的方式
O_TRUNC : 以清空的方式写入
O_NONBLOCK or O_NDELAY:以非阻塞的方式打开一个文件
mode :创建文件的权限(三位八进制数组成)
返回值:
成功:返回文件描述符
失败:返回-1
【2】read
原型:#include <unistd.h>
头文件:ssize_t read(int fd, void *buf, size_t count);
功能:从文件中获取一段内容写入到内存buf中
参数:
fd:目标文件描述符(从哪个文件中读)
buf:从文件中读取后写入内存的位置
count:写入文件的字节个数(写入内存的最大字节个数)
返回值:
成功:返回 读取到的字节个数
返回0:读到文件的末尾
失败:返回 -1
【3】write
头文件:#include <unistd.h>
原型:ssize_t write(int fd, const void *buf, size_t count);
功能:向文件中写入一段字符串
参数:
fd:目标文件描述符(向哪个文件写入内容)
buf:写入字符串的首地址
count:写入文件的字节的个数
注意:如果buf的长度小于count的值,则会产生空洞文件
如果buf的长度大于count的值,则写入count大小的字节
返回值:
成功:返回 实际写入文件的字节的个数
返回0:向文件中写入0个字节
失败:返回-1
作业:实现cp命令(cp 源文件路径 目标文件路径)
要求:可以支持拷贝图片(二进制文件)
提示:
1.源文件路径 目标文件路径 使用命令行参数实现
2.open函数打开两个文件(源文件,目标文件)
3.循环从源文件中读取内容,再循环写入新的文件中