***实现的目标:***生成一个文件加密器,将想要加密的文件拖拽进加密器实现文件的加密,再次拖拽实现文件的还原解密。
想要实现功能,需要了解一下main函数的参数。
main函数参数 == 命令行参数
main函数一般两种写法如下:
int main(void);
//后两种写法含义相同
int main(int argc, char* argv[]);
int main(int argc, char** argv);
void代表main函数没有参数,也是最常用的。
另一种带的参数是什么?main函数不是程序的入口吗,谁给他传参呢?这是很多人困惑的地方,main函数的参数是命令行参数,argc存储的是命令行指令的个数,argv存储的是每一条命令行指令。
代码演示:
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("命令行参数个数%d\n", argc);
for (int i = 0; i < argc; i++) {
printf("命令行参数%d:%s\n", i, argv[i]);
}
getchar();
return 0;
}
通过运行结果的打印来看,argc=1,这一条命令就是打开可执行文件。
如果是拖拽打开文件,那就是两条指令,第一个打开目标文件所使用的编辑器,第二个打开目标文件。
文件加密器的代码实现
代码可以直接运行,代码比较简单,关键代码具有注释信息,应该都能写出来,加密代码也是使用了非常简单的异或逻辑加密,也可以使用更加复杂的加密算法。
#include <stdio.h>
#include <Windows.h>
#include <string.h>
char* fileName(char* name) //去掉路径
{
char newName[100] = { 0 };
int len = strlen(name);
int j = 0;
for (size_t i = 0; i < len; i++)
{
if (name[i] == '\\')
{
j = 0;
continue;
}
newName[j] = name[i];
j++;
}
newName[j] = 0;
return newName;
}
int main(int argc, char* argv[])
{
if (argc == 1) {
return 1;
}
FILE* fpSrc = fopen(argv[1], "rb"); //打开源文件
FILE* fpDst = fopen("temp.temp", "wb"); //创建加密文件
int r;
char c;
while(1) //读取到字符时继续
{
r = fread(&c, 1, 1, fpSrc); //按字节读取
if (r < 1)
{
break;
}
c ^= 0x99; //加密
//按字节写入
fwrite(&c, 1, 1, fpDst);
}
fclose(fpSrc);
fclose(fpDst);
//删除源文件,修改加密文件名称
char command1[200] = { 0 };
char command2[200] = { 0 };
strcpy(command1,"del ");
strcat(command1, argv[1]);
strcpy(command2, "ren ");
strcat(command2, "temp.temp ");
strcat(command2, fileName(argv[1]));
system(command1);
system(command2);
return 0;
}