图片加密、遍历目录文件找.c与.h文件以及冒泡、插空与选择排序

一、图片加密

        思想:利用文件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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值