一、标准IO与文件IO的对比
库函数 系统调用(文件IO)
fopen/fclose open/close
fgetc/fputc read/write
fgets/fputs
fread/fwrite
fseek lseek
标准IO
1.有缓存的IO形式(程序缓存区满与内核进行数据交互)
2.标准是库函数
3.实时性差多用于操作普通文件
4.移植性好,可以用在Linux、Windows系统中
文件IO
1.没有缓存的IO形式(程序可以随时与内核进行数据交互)
2.文件IO是系统调用
3.实时性好多用于设备文件操作
4.移植性差,只能用在Linux系统中
系统调用: Linux内核中的函数接口
库函数: 是对系统调用的封装
二、承接上一期分享,接着来看函数接口
1.open
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_APPEND 追加
O_CREAT 文件不存在创建
O_ASYNC 异步IO
O_NONBLOCK 非阻塞IO
O_TRUNC 文件存在清0
mode:创建文件的权限
rwx rwx rwx rw- rw- r--
421 421 421 0 6 6 4
返回值:
成功返回新文件描述符
失败返回-1
插入知识点:
文件描述符:
内核每打开一个文件,会获得操作该文件的文件描述符
特点:
(1)非负整数(0 1 2 3 4 ..)
stdin -> 0
stdout-> 1
stderr-> 2
(2)新创建的文件描述符的值总为尚未被使用的最小的非负整数
(3)操作系统默认允许打开的文件描述符范围为(0-1023)
"r" O_RDONLY
"r+" O_RDWR
"w" O_WRONLY | O_CREAT | O_TRUNC
"w+" O_RDWR | O_CREAT | O_TRUNC
"a" O_WRONLY | O_CREAT | O_APPEND
"a+" O_RDWR | O_CREAT | O_APPEND
2.close
int close(int fd);
功能:关闭文件描述符
参数: 文件描述符
返回值:
成功返回0
失败返回-1
3.read/write
ssize_t write(int fd, const void *buf, size_t count);
功能: 向文件描述符中写入数据
参数:
fd:文件描述符
buf:写入数据空间首地址
count:写入数据的个数
返回值:
成功返回实际写入字节数
失败返回-1
注意:ssize_t类型就是有符号的整型,其实就是换了一种名称而已
ssize_t read(int fd, void *buf, size_t count);
功能: 从文件描述符中读取数据
参数:
fd:文件描述符
buf:存放读取数据空间首地址
count:读取字节数
返回值:
成功返回实际读取的字节数
失败返回-1
读到文件末尾返回0
4.lseek
off_t lseek(int fd, off_t offset, int whence);
功能: 设定文件描述符的偏移量
参数:
fd:文件描述符
offset:偏移量
whence:
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值:
成功返回当前位置的偏移量
失败返回-1
注意:off_t类型其实就是long int类型;
本期的知识点分享就到这里结束了,这也是博主在自学过程中整理的笔记,其中有自己一些见解,希望可以帮到小伙伴们,欢迎评论区留言哦!