基础知识介绍
1、文件IO是不带缓冲区的,只有标准IO有缓冲区
2、文件IO函数由操作系统提供,与操作系统绑定,又称之为系统调用函数
3、标准IO是通过流指针对文件进行操作,文件IO则是通过文件描述符来维护一个文件
文件描述符的本质
1、文件描述符总容量1024【getdtablesize()函数可获得该值】
2、特殊的文件描述符0、1、2对应特殊的流指针stdin、stdout、stderr
3、当调用多个函数打开同一个文件的时候,文件描述符不一致,打开多少次就有多少个文件描述符。以及系统文件表、inode表均不一致。但是,inode表中对应的inode的号是同一个文件的inode号。(表不是同一张表,inode号是同一个文件的inode号)
文件IO的函数介绍
1、open打开文件
int fd_r = open("./1.png", O_RDONLY); //以只读的方式打开对应文件
2、关闭文件
close(fd_r);
3、读取文件内容,读取到sizeof-1个字符串
res = read(fd_r, buf, sizeof(buf)); //read函数读取了size-1个字符串
注意:
1. read函数读取数据,不会自动补充\0, 所以建议读取字符串前,先清空字符串。
2. size_t count:如果后序代码需要依据'\0'位置,例如%s打印,或者string函数族等函数操作读取到的字符串。
则调用函数的时候,需要记住手动保留出\0位置
3. read函数遇到空格 \n 新的一行,不会停止读取。
4、写操作函数
write(fd_w, buf, res); //最后一个参数res,读取多少写入多少
5、lseek函数,修改文件的偏移量
off_t size = lseek(fd, 0, SEEK_END);
printf("size = %ld\n", size);
6、umask函数,重置文件权限掩码
一般放在创建新文件前面
//设置mask,后续设置打开文件的权限
umask(0);
文件IO函数实现图片的拷贝
程序实例
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, const char *argv[])
{
//以读的方式打开源文件
int fd_r = open("./1.png", O_RDONLY);
//以写的方式打开目标文件
int fd_w = open("./2.png", O_WRONLY | O_CREAT | O_TRUNC, 0664);
//循环读取和写入
ssize_t res = 0;
char buf[32] = "";
while(1)
{
bzero(buf, sizeof(buf)); //清空字符串
res = read(fd_r, buf, sizeof(buf)); //read函数读取了size-1个字符串
if(0 == res)
break; //文件读取完毕
//将读取的文件执行写入操作
write(fd_w, buf, res); //最后一个参数res,读取多少写入多少
}
//关闭文件
close(fd_r);
close(fd_w);
return 0;
}
运行结果
ubuntu@ubuntu:06-1-test$ diff 1.png 2.png //查看拷贝后的图片是否相同,如果不同会有提示二进制文件不同