文件加密解密的学习

一.main函数的命令行参数的使用

  1. 一个程序的main()函数的可以包括两个参数

    第一个参数的类型为int型;
    第二个参数为字符串数组。
    通常情况下,将第一个参数命名为argc,第二个参数为argv(当然参数名字可以换)。由于字符串数组有两种表达方式,因此,main函数存在两种书写方法:

    形式一:

    int main(int argc, char* argv[])//这里使用char* argv[]
    {return 0;
    }
    

    形式二:

    int main(int argc, char** argv)//这里使用char ** argv
    {return 0;
    }
    

    注 :

    • 其中int argc记录参数(及字符串)的个数 argc=1+用户输入的字符串的个数 , 操作系统负责计算数量若用户输入N个字符串,那么argc= N + 1

    • 其中char* argv[]或char**argv指的是指向字符型指针数组的指针 , 首先它是一个指针 , 这个指针是指向数组的,而这个数组的成员也是指针 , 成员指针是指向字符型数组的。

      注意:操作系统会自动加入一条字符串(程序名称)到字符串数组中,因此,最终的字符串数数组长度为N+1。在代码编码使用字符串内容时,需要注意字符串的索引号

      例如:

      argv[0]=可执行文件名称,例如test.exe(非用户输入,操作系统根据可执行文件名称自动生成)
      argv[1]= 字符串1
      argv[2]=字符串2
      argv[3]=字符串3

    • 命令行 : program(文件名) str1 str2 str3(参数)

  2. 使用

    1. 编程状态下的使用:

      若参数类型不满足程序最终的类型,就要进行类型转换,主要表现在字符串和数字之间的转换,例如将字符串 argv[1]=”21321”转换为整型变量,可以使用

      int temp=atoi(argv[1]);
      
    2. 用户在cmd窗口输入

      打开cmd窗口后,将可执行文件拖入窗口,根据程序要求的符串数量输入字符串,并以空格分开各个字符串,输入结束后回车即可。

二.文件操作的容错处理

在进行文件型数据类型操作时,若文件为空或者不存在.程序会因不能进入文件操作循环体而不对操作过程作任何反应。为此,在对文件进行操作之前.要首先对文什状态进行检测、处理。

三.文件的处理

  1. 文件指针的声明

    //下面的代码是将文件指针赋给fp1
    FILE *fp1;
    fp1=fopen("xxxxx","r");//xxxxx表示路径,r表示打开文件的方式
    
  2. fopen( )函数的学习 (用来打开一个文件)

    1. 声明:

      FILE *fopen(const char *filename, const char *mode)
      
    2. 参数

      • filename --这是C字符串 ,包含了要打开的文件名称。

      • mode – 这是 C 字符串,包含了文件访问模式,模式如下:

        模式 描述
        “r” 打开一个用于读取的文件。该文件必须存在。
        “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
        “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
        “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。
        “w+” 创建一个用于读写的空文件。
        “a+” 打开一个用于读取和追加的文件。

      注:

      • 上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt,wt,其中t表示以文本模式打开文件。

      • 二进制和文本模式的区别

        1. 在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。

        2. 在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别

    3. 返回值

      该函数返回一个FILE指针。否则返回NULL。

    4. 实例

      下面的实例演示了 fopen() 函数的用法。

      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {FILE * fp;fp = fopen ("file.txt", "w+");fprintf(fp, "%s %s %s %d", "We", "are", "in", 2019);fclose(fp);return(0);
      }
      

      让我们编译并运行上面的程序,这将创建一个带有一下内容的文件 file.txt

      We are in 2019
      

      现在让我们使用下面的程序查看上面文件的内容:

      #include <stdio.h>
      int main ()
      {FILE *fp;int c;fp = fopen("file.txt","r");while(1){c = fgetc(fp);if( feof(fp) ){ break ;}printf("%c", c);}fclose(fp);return(0);
      }
      
  3. fclose( )函数的学习 (用来关闭一个由fopen( )函数打开的文件)

    1. 声明

      int fclose(FILE *stream);
      
    2. 返回值

      返回一个整型数 。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。

  4. fgetc( )函数的学习(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。)

    1. 声明

      int fgetc(FILE *stream)
      
    2. 参数

      stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。

    3. 返回值

      该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

  5. fputc( )函数的学习( 用来把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。)

    1. 声明

      int fputc(int char, FILE *stream)
      
    2. 参数

      char --这是要被写入的字符。该字符以其对应的 int 值进行传递。

      stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。

    3. 返回值

      如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

四.register的学习

  1. register 就是CPU寄存器的意思,这个里面的变量要比放在内存里读取快很多
  2. 但是register的空间很小,一般也就几MB的样子,服务器的CPU可能会更大一些。如果寄存器用完了即使你的变量声明的时候带上register也不会放进寄存器里面。

五.加密算法的学习

目前使用的是比较简单的对称加密算法 ,即通过改字符的对应编码来使其达到乱码

在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密。这就要求加密和解密方事先都必须知道加密的密钥。

数据加密过程:在对称加密算法中,数据发送方 将 明文 (原始数据) 和加密密钥 一起经过特殊 加密处理,生成复杂的 加密密文 进行发送。

数据解密过程:数据接收方 收到密文后,若想读取原数据,则需要使用 加密使用的密钥 及相同算法的 逆算法 对加密的密文进行解密,才能使其恢复成 可读明文。

源码如下:

一.编辑器正常运行操作版本

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<bits/stdc++.h>
void encfile(char *in_filename,char *pwd,char *out_filename);       /*对文件进行加密的具体函数*/
void decryptfile(char* in_filename,char *pwd,char *out_filename);   /*对文件进行解密的具体函数*/  int main()
{   int option; /*功能选择*/  /*in_filename和out_filename之前由于设置太小导致内存污染使opinion的值发生变化*/ char in_filename[3000];  /*用户输入的要加密的文件名或是要解密的文件*/   char out_filename[3000]; /*用户输入加密后保存的文件名或是解密保存的文件名*/  char pwd[1000];/*用来保存密码*/   printf("thank you for using this program......\n");  printf("1. Encrypt a file\n2. Decrypt a file\n");      printf("chose your option......");  scanf("%d",&option);  getchar();  printf("Please input In-filename:\n");   gets(in_filename);/*得到要加密的文件名,这里可以直接把要加密的文件或要解密的文件拖入"源代码.exe"中*/   printf("Please input your Password:\n");   gets(pwd);/*得到密码*/   printf("Please input Out-filename:\n");   gets(out_filename);/*得到加密后你要的文件名*/       switch(option){  case 1: //加密      encfile(in_filename,pwd,out_filename);/*加密函数调用*/   break;  case 2://解密  decryptfile(in_filename,pwd,out_filename);/*解密函数调用*/  break;  default:  break;  }     system("pause");/*输出“请按任意键继续...”的字,等待用户按一个键,然后返回。*/   return 0;
}   /*加密子函数开始*/
void encfile(char *in_filename,char *pwd,char *out_file)
{   FILE *fp1,*fp2;/*声明文件指针*/register char ch;//声明寄存器变量,增加读取速度   int j=0;   int j0=0;   fp1=fopen(in_filename,"r");/*打开要加密的文件*/   if(fp1==NULL){   printf("cannot open in-file.\n");   exit(1);/*如果不能打开要加密的文件,便退出程序*/   }   fp2=fopen(out_file,"w");   if(fp2==NULL){   printf("cannot open or create out-file.\n");   exit(1);/*如果不能建立加密后的文件,便退出*/   }   while(pwd[++j0]);  ch=fgetc(fp1); /*从文件指针指定的文件中读入一个字符*/  /*加密算法开始*/   while(!feof(fp1)){   if(j0 >7)  j0 = 0;  ch += pwd[j0++];  fputc(ch,fp2);  /*把参数 ch指定的字符(一个无符号字符)写入到fp2中,并把位置标识符往前移动。*/ ch=fgetc(fp1); /*从fp1中获取下一个字符(一个无符号字符),并把位置标识符往前移动*/  }   fclose(fp1);/*关闭源文件*/   fclose(fp2);/*关闭目标文件*/
}   /*解密子函数开始*/
void decryptfile(char *in_filename,char *pwd,char *out_file)
{   FILE *fp1,*fp2;   register char ch;   int j=0;   int j0=0;   fp1=fopen(in_filename,"r");/*打开要解密的文件*/   if(fp1==NULL){   printf("cannot open in-file.\n");   exit(1);/*如果不能打开要解密的文件,便退出程序*/   }   fp2=fopen(out_file,"w");   if(fp2==NULL){   printf("cannot open or create out-file.\n");   exit(1);/*如果不能建立解密后的文件,便退出*/   }   while(pwd[++j0]);     ch=fgetc(fp1);   /*解密算法开始*/   while(!feof(fp1)){   if(j0 >7)  j0 = 0;  ch -= pwd[j0++];  fputc(ch,fp2); ch=fgetc(fp1);   }   fclose(fp1);/*关闭源文件*/   fclose(fp2);/*关闭目标文件*/
}

二.命令行操作版本

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<bits/stdc++.h>
void encfile(char *in_filename,char *pwd,char *out_filename);       /*对文件进行加密的具体函数*/
void decryptfile(char* in_filename,char *pwd,char *out_filename);   /*对文件进行解密的具体函数*/  int main(int argc,char *argv[])/*定义main()函数的命令行参数*/
{   int option; /*加密或解密的功能选择*/  /*in_filename和out_filename之前由于设置太小导致内存污染使opinion的值发生变化,也可以动态分配内存*/ char in_filename[30000];  /*用户输入的要加密的文件名或是要解密的文件*/   char out_filename[30000]; /*用户输入加密后保存的文件名或是解密保存的文件名*/  char pwd[1000];/*用来保存密码*/   if(argc!=4)/*4指的是程序名+文件名+密码+加密后的文件名,一共4个参数*/ {/*容错处理*/   printf("Please input In-filename:\n");   gets(in_filename);/*得到要加密的文件名,这里可以直接把要加密的文件或要解密的文件拖入"源代码.exe"中*/   printf("Please input your Password:\n");   gets(pwd);/*得到密码*/   printf("Please input Out-filename:\n");   gets(out_filename);/*得到加密后你要的文件名*/       }  else{/*如果命令行参数正确,便直接运行程序*/ strcpy(in_filename,argv[1]);strcpy(pwd,argv[2]);   strcpy(out_filename,argv[3]);  }   printf("1. Encrypt a file\n2. Decrypt a file\n");      printf("chose your option......");  scanf("%d",&option);  getchar();switch(option){  case 1: //加密      encfile(in_filename,pwd,out_filename);       /*加密函数调用*/   break;  case 2: //解密  decryptfile(in_filename,pwd,out_filename);   /*解密函数调用*/  break;  default:  break;  }   printf("thank you for using this program......\n");system("pause");/*命令行上输出“请按任意键继续...”的字,等待用户按一个键,然后返回。*/   return 0;
}   /*加密子函数开始*/
void encfile(char *in_filename,char *pwd,char *out_file)
{   FILE *fp1,*fp2;/*声明文件指针*/register char ch;   int j=0;   int j0=0;   fp1=fopen(in_filename,"r");/*打开要加密的文件*/   if(fp1==NULL){   printf("cannot open in-file.\n");   exit(1);/*如果不能打开要加密的文件,便退出程序*/   }   fp2=fopen(out_file,"w");   if(fp2==NULL){   printf("cannot open or create out-file.\n");   exit(1);/*如果不能建立加密后的文件,便退出*/   }   while(pwd[++j0]);  ch=fgetc(fp1); /*从文件指针指定的文件中读入一个字符*/  /*加密算法开始*/   while(!feof(fp1)){   if(j0 >7)  j0 = 0;  ch += pwd[j0++];  fputc(ch,fp2);  /*把参数 ch指定的字符(一个无符号字符)写入到fp2中,并把位置标识符往前移动。*/ ch=fgetc(fp1); /*从fp1中获取下一个字符(一个无符号字符),并把位置标识符往前移动*/  }   fclose(fp1);/*关闭源文件*/   fclose(fp2);/*关闭目标文件*/
}   /*解密子函数开始*/
void decryptfile(char *in_filename,char *pwd,char *out_file)
{   FILE *fp1,*fp2;   register char ch;   int j=0;   int j0=0;   fp1=fopen(in_filename,"r");/*打开要解密的文件*/   if(fp1==NULL){   printf("cannot open in-file.\n");   exit(1);/*如果不能打开要解密的文件,便退出程序*/   }   fp2=fopen(out_file,"w");   if(fp2==NULL){   printf("cannot open or create out-file.\n");   exit(1);/*如果不能建立解密后的文件,便退出*/   }   while(pwd[++j0]);     ch=fgetc(fp1);   /*解密算法开始*/   while(!feof(fp1)){   if(j0 >7)  j0 = 0;  ch -= pwd[j0++];  fputc(ch,fp2); ch=fgetc(fp1);   }   fclose(fp1);/*关闭源文件*/   fclose(fp2);/*关闭目标文件*/
}

简单的文本文件加密小程序相关推荐

  1. 简单描述下微信小程序的相关文件类型?

    简单描述下微信小程序的相关文件类型? 微信小程序项目结构主要有四个文件类型,如下: .WXML 是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构.内部主要是微信自己定义的一套组件 ...

  2. 编写一个随机抽奖程序php,基于PHP实现简单的随机抽奖小程序

    摘要:一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身.然后随即生成一个0到最大数之间的一个数,通过循 ...

  3. 随机循环抽奖小程序_c语言,基于JavaScript实现简单的随机抽奖小程序

    对于抽奖这样的小程序使用诸如VB,Delphi等工具来实现会比较的方便,由于本人机器上没有装这样的应用程序,所以只能另寻其道.为了使抽奖程序能够无需配置平台直接可以在任何一台机器上运行,开发工具和编译 ...

  4. 多功能工具箱微信小程序源码下载-操作简单实用流量主小程序

    这是一款多功能工具箱小程序! 目前由N款小功能组合成 比如: 图片拼接 九宫格切图 透明昵称 文字表情 等等上面说的只是一部分 该款小程序无需服务器与域名 使用微信开发者工具打开文件然后上传提交审核即 ...

  5. 简单有趣的matlab小程序_超实用有趣的五个小程序推荐

    大家好,我是小胖. 废话不多说,进入正题. 1.一周CP共读 有趣的灵魂总会相遇. 一个极简的社交小程序. 通过选择自己喜欢的一本书,匹配到那个跟自己有着一样有趣灵魂的TA. 选择好要阅读哪本书之后, ...

  6. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  7. 简单的python有趣小程序-【实战案例】利用Python做出趣味版防沉迷小程序

    今天带领大家利用Python做出趣味版防沉迷小程序 查询电脑的所有进程 用Python循环检测电脑软件的运行情况,当发现游戏软件时弹出警告窗口,并截图保存.学会这项技能,就再也不怕孩子偷偷打游戏了.下 ...

  8. 实战|轻松用 Python 开发一个简单有趣的聊天小程序

    前言 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol). UDP 为应用程序提供了一种无需建立连接就可以发送封装的 I ...

  9. 简单php抽奖,基于PHP实现简单的随机抽奖小程序_PHP

    一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身. 然后随即生成一个0到最大数之间的一个数,通过循环查 ...

最新文章

  1. WPF加载相对路径的图片的解决方法
  2. Android开发之5.0已以上版本沉浸式状态栏
  3. python求偏度系数_用 Python 讲解偏度和峰度
  4. 深度学习(七十二)tensorflow 集群训练
  5. Android插件GsonFormat
  6. Matlab中句柄类
  7. 主流反外挂技术的优缺点比较
  8. ppt太大如何压缩到最小
  9. 截止失真放大电路_常用音响技术:音频功放失真及改善方法
  10. Samba————Linux与windows共享文件
  11. iOS苹果超级签苹果分发平台企鹅:422903005
  12. SpringDataJPA(二):SpringDataJPA的运行原理以及基本操作
  13. Java 线程池常见误区
  14. “OXO”历史上最早开发的电子游戏——游戏编年史
  15. 互联网摸鱼日报(2022-10-08)
  16. 在linux服务器上用headless firefox打开中文网页,字体乱码问题
  17. 培训机构让Github的含金量降低了?
  18. pixi 小游戏_PIXI兼容微信小游戏
  19. TK:安全的核心仍在于重视 移动安全应更多的考虑耦合风险
  20. Eclipse 3.6 M7(太阳神版)发布

热门文章

  1. 判断IE关闭还是刷新
  2. canal下载 linux_阿里canal数据库同步ES使用
  3. 结巴分词关键词相似度_辨别标题党--提取关键词与比较相似度
  4. vba 字体颜色_VBA第一章自检,23关,你能破吗?
  5. 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...
  6. Win-MASM64汇编语言-DUP/TIMES
  7. Kafka-partition
  8. linux 网络定时断链,客户端连接linux经常间隔性断开链接
  9. 将系统升级为鸿蒙11.1系统,即将脱胎换骨!EMUI11.1升级名单遭曝光,或要和跟安卓说再见...
  10. enet分割_论文阅读 | CVPR 2016 | 语义分割论文: ENet