简单的文本文件加密小程序

文件加密解密的学习

一.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);/*关闭目标文件*/   
}   
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值