大家好,我是练习编程时长两年半的个人练习生昆工第一ikun,昨天咋们说了标准IO,今天咋们来分享文件IO,以及一个很有趣的实例,给图片加密,使其无法打开。话不多说,上代码。
文件IO遵循POSIX标准,文件IO实际上使用的系统调用函数
文件IO中通过文件描述符唯一标识一个文件
文件描述符是一个按顺序分配的最小的非负整数,当用户打开或者新建一个文件时,系统会向当前进程返回一个最小的可用的文件描述符。
三个特殊的文件描述符
标准输入 -- 0 -- stdin
标准输出 -- 1 -- stdout
标准错误 -- 2 -- stderr
open、close -- 打开关闭文件
read、write -- 读写文件
lseek -- 文件定位
#include
#include
#include
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_EXCL:一般和O_CREAT联合使用,用于检测文件是否存在
O_APPEND: 以追加的方式打开文件,在文件末尾另起一行继续写入
O_TRUNC:打开文件之后,会将原文件清空
mode:
当需要创建新文件时,需要用该参数给新建文件设置初始权限,一般设为0664;
返回值:
成功返回文件描述符,失败返回-1;
#include int close(int fd); 参数: fd:要关闭文件的文件描述符 返回值: 成功返回0,失败返回-1
#include ssize_t read(int fd, void *buf, size_t count); 参数: fd:读取文件的文件描述符 buf:用户自定义的缓冲区,用于存放读取的内容 count:请求读取的字节数 返回值: 成功返回读取的字节数,失败返回-1,返回0表示读到文件末尾;
#include ssize_t write(int fd, const void *buf, size_t count); 参数: fd:读取文件的文件描述符 buf:用户自定义的缓冲区,用于存放准备写入的内容 count:请求写入的字节数 返回值: 成功返回写入的字节数,失败返回-1;
#include#include off_t lseek(int fd, off_t offset, int whence); 参数: fd:文件描述符 offset:偏移量,可正可负 whence:基准点 SEEK_SET:定位在文件开头 SEEK_CUR:定位在当前位置 SEEK_END: 定位在文件末尾 返回值: 成功返回当前定位位置相对于文件开头的偏移量,失败返回-1
对图片进行加密解密操作
思路:
1、开打图片 -- open
2、读取图片的前10个字节 -- read
3、将读取的10个字节有序地打乱 -- (字符串倒序)
4、将文件指针重新定位在文件开头 -- lseek
5、将打乱的10个字节写入文件 -- write
6、关闭文件 -- close
代码如下:
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
int fd = open("cxk.jpg", O_RDWR);
if(fd < 0)
{
perror("open");
return -1;
}
char buf[64] = {0};
char s[3];
printf("请输入三位密码:\n");
fgets(s, 3, stdin);
read(fd, buf, 10);
int i = 0, j = 9;
while(i < j)
{
char t = buf[i];
buf[i] = buf[j];
buf[j] = t;
i++;
j--;
}
lseek(fd, 0, SEEK_SET);
write(fd, buf, 10);
printf("密码错误,文件已加密\n");
return 0;
}
运行程序,如下图:
我们可以看到图片由于头部数据被破坏,所以已经无打开,我们再次运行程序将头部数据恢复,图片就能打开了。
今天分享的内容就到这了,我是练习编程时长两年半的个人练习生昆工第一ikun,咋们明天见。