1.文件IO与标准IO区别:
- 标准IO有缓存,是库函数,适用于处理普通文件
- 文件IO无缓存,是系统调用,适用于处理设备文件、通信文件
2.系统调用
- Linux内核中的函数接口
3.库函数
- 对系统调用的封装
4.系统默认打开3个文件描述符
- 0:标准输入->stdin
- 1:标准输出->stdout
- 2:标准错误->stderr
5.文件描述符的特性
- 文件描述符有上限限制
- 新产生的文件描述符总是选择最小且尚未被使用的非负整数
6.文件IO接口
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_CREAT 文件不存在则创建 权限:一般0664(rw-rw-r--)
O_TRUNC 文件存在则截断清0
O_EXCL 文件则存在报错
O_APPEND 追加
O_ASYNC 异步IO
返回值:
成功返回新的文件描述符
失败返回-1
r -> O_RDONLY
r+ -> O_RDWR
w -> O_WRONLY | O_CREAT | O_TRUNC, 0664
w+ -> O_RDWR | O_CREAT | O_TRUNC, 0664
a -> O_WRONLY | O_CREAT | O_APPEND, 0664
a+ -> O_RDWR | O_CREAT | O_APPEND, 0664
cs
fd = open("file.txt",O_RDONLY);
fd = open("file.txt",O_RDWR);
fd = open("file.txt",O_WRONLY | O_CREAT | O_TRUNC,0664);
fd = open("file.txt",O_RDWR | O_CREAT | O_TRUNC,0664);
fd = open("file.txt",O_RDONLY | O_CREAT | O_APPEND,0664);
fd = open("file.txt",O_RDWR | O_CREAT | O_APPEND,0664);
2).close
原型:int close(int fb)
功能:关闭文件描述符
3).write
原型:ssize_t write(int fd, const void *buf, size_t count);
功能:向fd中写入从buf开始的count个字节
参数:
fb:文件描述符
buf:写入数据空间的首地址
count:写入数据的字节数
返回值:
成功返回实际写入的字节数
失败返回-1
4).read
原型:ssize_t read(int fd, void *buf, size_t count);
功能:从fd中读取count个字节放入buf开始的空间
参数:
fb:文件描述符
buf:存放数据空间的首地址
count:最多读取的字节数
返回值:
成功返回实际读取字节个数
读到文件末尾返回0
读取出错返回-1
5).lseek
原型:off_t lseek(int fd, off_t offset, int whence);
功能:重定位文件描述的偏移量
参数:
fd:文件描述符
offset:偏移量
whence:
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
返回值:
成功返回偏移量
失败返回-1
7.ex
下为图片文件的拷贝
cs
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void)
{
int afd = 0;
int bfd = 0;
ssize_t a = 0;
char tmpbuff[1024] = {0};
afd = open("yinga.jpg",O_RDONLY);
if(-1 == afd)
{
perror("fail to open");
return EOF;
}
bfd = open("yingb.jpg",O_WRONLY | O_CREAT | O_TRUNC,0664);
if(-1 == bfd)
{
perror("fail to open");
return EOF;
}
while(1)
{
a = read(afd,tmpbuff,sizeof(tmpbuff));
write(bfd,tmpbuff,a);
if(a == 0)
break;
}
close(afd);
close(bfd);
return 0;
}