一、图片加密
思想:利用文件IO 程序解析图片后的二进制数据,将一张图片解析后前10个字节前后替换即完成加密,然后在运行程序后即解密。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
//main函数传参 传入图片路径
if(argc != 2)
{
puts("usage:./a.out file");
return -1;
}
int fd = -1;
//文件IO打开图片
fd = open(argv[1], O_RDWR);
if(fd < 0)
{
puts("open error!");
return -1;
}
char buf[10] = {'\0'};
//读取图片前10字节信息
int ret = read(fd, buf, 10);
if(ret < 0)
{
puts("read error!");
return -1;
}
int size = 10;
//前10字节交换 完成加密或者解密
int i = 0;
for(i = 0; i < size/2; i++)
{
char tmp = buf[i];
buf[i] = buf[size-1-i];
buf[size-i-1] = tmp;
}
lseek(fd, 0, SEEK_SET);
int ret_w = write(fd, buf, 10);
if(ret < 0)
{
puts("write error!");
return -1;
}
else
{
puts("process is successful!");
}
close(fd);
return 0;
}
二、遍历目录文件
执行效果:遍历一个目录文件夹(文件夹内也可以存在目录文件),从中找寻找.c和.h文件然后将其地址记录在另一个文本文件内,并记录.c和.h文件内所写代码的行数。
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <dirent.h>
int mywrite(DIR *p,char *q, int fd);
int main(int argc, char *argv[])
{
if(argc != 3)
{
puts("usage:./a.out dirent");
return -1;
}
//写入要操作的文件夹
DIR *p = opendir(argv[1]);
if(NULL == p)
{
puts("NULL ERROR");
return -1;
}
puts("open success");
//写入.c和.h的路径 给读写权限 ,没有则创建 写入时为追加
int fd = -1;
fd = open(argv[2], O_WRONLY | O_APPEND | O_CREAT, 0666);
if(fd < 0)
{
puts("file error!");
return -1;
}
//传入文件夹操作对象指针,文件路径,要写入内容的文件描述符
mywrite(p,argv[1],fd);
//关闭文件
close(fd);
closedir(p);
puts("OVER!");
return 0;
}
int mywrite(DIR *p,char *q, int fd)
{
if(p == NULL)
{
puts("NULL ERROR");
return -1;
}
while(1)
{
//读文件夹
struct dirent *point = readdir(p);
if(point)
{
//如果为目录文件
if(point->d_type == DT_DIR)
{
//判断不是'.'当前目录 和".." 上一级目录文件 避免死循环
if(strcmp(point->d_name, ".") && strcmp(point->d_name,".."))
{
char tmp[100] = {'\0'};
//定义一个新的字符串 将main传参的文件夹地址放进来
strcat(tmp,q);
//因为写入的有可能是../ 不需要再往后面写'/' 如果只是文件夹名
//则再后面连'/'以便后面打开文件夹所需的地址
int q = strlen(tmp);
if(tmp[q-1] != '/')
{
strcat(tmp, "/");
}
//在前面的基础上地址后面写入判断到的目录文件名
strcat(tmp,(point->d_name));
//打开这一新的目录文件
DIR *pN = opendir(tmp);
//递归 传入新的文件操作指针 进行判断
mywrite(pN, tmp, fd);
}
}
else if(point->d_type == DT_REG)
{
//将普通文件名写入新的字符串里
//进行判断最后两个是否为'.'和'c'或者'h'
char compare[20] = {'\0'};
strcpy(compare, point->d_name);
int i = strlen(compare);
if((compare[i-2] == '.') && ((compare[i-1] == 'c') || \
(compare[i-1] == 'h')))
{
//满足.c .h文件则将此时的文件操作指针内字符串写入
char link[100] = {'\0'};
strcpy(link,q);
//同上判断 例如输入 ./文件名 防止写入时出现"//"
int j = strlen(link);
if(link[j-1] != '/')
{
strcat(link, "/");
}
//在此时的字符串内基础上加入文件名
strcat(link, point->d_name);
//打开.c .h文件
int fd_l = open(link, O_RDONLY);
//统计文件字节数
int all_size = 0;
//用来格式化整型数字存储在字符串内
char all[20] = {'\0'};
if(fd_l> 0)
{
//计算文件内字节数
all_size = lseek(fd_l, 0, SEEK_END);
//定义一个字符串单个读取文件内字符
char line[2] = {'\0'};
int sum = 0;
if(all_size > 0)
{
//重新将文件指针放置在最开始
lseek(fd_l, 0, SEEK_SET);
//遍历文件内每一个字符包括最后一个'\n'
//vim程序最后行字符最后一个字符自带'\n'
while(all_size--)
{
//读取文件内每一个字符
int read_char = read(fd_l, line, 1);
//遇到'\n'则加一
if(line[0] == '\n')
{
printf("%c ",line[0]);
sum++;
}
}
//将统计好的行数格式化放在字符串内
sprintf(all, "行数为:%d\n", sum);
}
else if(all_size == 0)
{
sprintf(all, "行数为:%d\n", all_size);
}
}
//将.c .h 地址写入文件
strcat(link, "\n");
write(fd, link, strlen(link));
write(fd, all, strlen(all));
}
}
}
else
{
break;
}
}
}
三、数组排序
类别:冒泡排序,插孔排序,选择排序
//主函数
#include <stdio.h>
int eff_sort(int *);
int choose_sort(int *);
int insert_sort(int *);
int main()
{
int aar[8] = {-2,5,7,6,3,1,13,-4};
int *p = aar;
//eff_sort(p);
//choose_sort(p);
insert_sort(p);
int i = 0;
for(i = 0; i < 8 ; i++)
{
printf("%d ",p[i]);
}
puts("");
return 0;
}
//子函数
//冒泡排序
int eff_sort(int *p)
{
int i = 0;
int j = 0;
for(i = 0; i < 7; i++)
{
for(j = 0; j < 7-i; j++)
{
if(p[j] > p[j+1])
{
int tmp = p[j+1];
p[j+1] = p[j];
p[j] = tmp;
}
}
}
return 0;
}
//选择排序
int choose_sort(int *p)
{
int sum = 0;
int i = 0;
int j = 0;
int max = p[0];
//循环8次判断
for(i = 0; i < 8; i++)
{
//每次大循环重新给max赋值
max = p[0];
for(j = 0; j < 8-i; j++)
{
//循环每一个数如果最大记住下标并将最大值赋值给max
if(p[j] > max)
{
max = p[j];
sum = j;
}
}
//将最大值与最后一个值换位置 此时最大排在最后面也就使得小循环
//次数减小 下一次会写入倒数第二个 以后依次如此
int tmp = p[7-i];
p[7-i] = p[sum];
p[sum] = tmp;
}
return 0;
}
//插孔排序
int insert_sort(int *p)
{
int i = 0;
int j = 0;
for(i = 0; i < 8; i++)
{
for(j = 0 ; j < i; j ++)
{
if(p[i] < p[j])
{
int tmp = p[j];
p[j] = p[i];
p[i] =tmp;
}
}
}
return 0;
}