2.文件IO
1.操作方法
1.打开文件 open
2.读写文件 read/write
3.关闭文件 close
2.man手册章节
1.标准命令
2.系统掉用
3.库函数
4.设备说明
5.文件格式
6.娱乐
7.杂项
8.管理员命令
2.函数接口使用:
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_ASYNC 异步IO
O_CREAT 创建
O_EXCL 检测文件是否存在
O_NONBLOCK 非阻塞IO
O_TRUNC 截断(清零)
返回值:
成功返回文件描述符
失败返回-1
文件描述符范围:3 - 1023
0:stdin 标准输入
1:stdout 标准输出
2:stderr 标准出错
文件描述符产生规律:
1.范围 0 - 1023
2.总是取尚未被占用的最小的非负整数
2.close
int close(int fd);
功能:
关闭文件描述符
3.read
ssize_t read(int fd, void *buf, size_t count);
功能:
向文件中读取数据
参数:
fd:文件描述符
buf:读取数据存放的空间首地址
count:实际读取字节数
返回值:
成功返回实际读取字节数
失败 -1;
结束 0;
4.write
ssize_t write(int fd, const void *buf, size_t count);
功能:
向文件中写入数据
参数:
fd:文件描述符
buf:写入数据存放的空间首地址
count:实际写入字节数
返回值:
成功返回实际写入字节数
失败 -1;
5.lseek
标准IO和文件IO的区别
1.系统调用:
Linux内核中的代码称为系统调用
Shell
1.Shell命令解释器
2.保护内核
2.库函数
是针对操作系统内核中代码的封装
3.区别
1.标准IO是库函数,在Linux和Windows平台中均能使用
2.文件IO是系统调用,只有在Linux内核平台中才能使用
3.标准IO是一种有缓存的IO
4.文件IO是没有缓存的IO
4.标准IO应用场景:
1.主要用来操作普通文件
5.文件IO应用场景:
1.主要用来操作设备文件以及除普通文件外其余类型的文件
6.标准IO缓存
标准IO中的函数接口将数据放入缓存区,满足刷新条件交给内核
缓存分类:
1.全缓存 与文件建立的缓存
缓冲区满,刷新缓存区
刷新条件:
1.存满4k刷新
2.程序结束刷新(fclose刷新)
3.fflush函数强制刷新
2.行缓存 与终端建立的缓存
遇到\n刷新
刷新条件:
1.遇到\n刷新
2.存满1k刷新
3.程序结束刷新(fclose刷新)
4.fflush函数强制刷新
3.不缓存 人机交互、界面控制、出错处理
直接刷新
文件IO实现文件拷贝:
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, const char *argv[])
{
int srcfd = 0;
int dstfd = 0;
char buffer[1024] = {0};
int nret = 0;
if(3 != argc)
{
perror("Usage: ./a.out srcfilename dstfilename");
return -1;
}
srcfd = open(argv[1], O_RDONLY);
if(-1 == srcfd)
{
perror("failed to open");
return -1;
}
dstfd = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0664);
if(-1 == dstfd)
{
perror("failed to open");
return -1;
}
while(1)
{
nret = read(srcfd, buffer, sizeof(buffer));
if(nret <= 0)
{
break;
}
write(dstfd, buffer, nret);
}
close(srcfd);
close(dstfd);
return 0;
}