简单的文本文件加密小程序
文件加密解密的学习
一.main
函数的命令行参数的使用
一个程序的
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(参数)
使用
编程状态下的使用:
若参数类型不满足程序最终的类型,就要进行类型转换,主要表现在字符串和数字之间的转换,例如将字符串 argv[1]=”21321”转换为整型变量,可以使用
int temp=atoi(argv[1]);
用户在cmd窗口输入
打开cmd窗口后,将可执行文件拖入窗口,根据程序要求的符串数量输入字符串,并以空格分开各个字符串,输入结束后回车即可。
二.文件操作的容错处理
在进行文件型数据类型操作时,若文件为空或者不存在.程序会因不能进入文件操作循环体而不对操作过程作任何反应。为此,在对文件进行操作之前.要首先对文什状态进行检测、处理。
三.文件的处理
文件指针的声明
//下面的代码是将文件指针赋给fp1 FILE *fp1; fp1=fopen("xxxxx","r");//xxxxx表示路径,r表示打开文件的方式
fopen( )函数的学习 (用来打开一个文件)
声明:
FILE *fopen(const char *filename, const char *mode)
参数
filename --这是C字符串 ,包含了要打开的文件名称。
mode – 这是 C 字符串,包含了文件访问模式,模式如下:
模式 描述 “r” 打开一个用于读取的文件。该文件必须存在。 “w” 创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。 “a” 追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。 “r+” 打开一个用于更新的文件,可读取也可写入。该文件必须存在。 “w+” 创建一个用于读写的空文件。 “a+” 打开一个用于读取和追加的文件。
注:
上述的形态字符串都可以再加一个b字符,如
rb
、w+b
或ab+
等组合,加入b 字符用来告诉函数库以二进制模式打开文件。如果不加b,表示默认加了t,即rt
,w
t,其中t表示以文本模式打开文件。二进制和文本模式的区别
在windows系统中,文本模式下,文件以"\r\n"代表换行。若以文本模式打开文件,并用fputs等函数写入换行符"\n"时,函数会自动在"\n"前面加上"\r"。即实际写入文件的是"\r\n" 。
在类Unix/Linux系统中文本模式下,文件以"\n"代表换行。所以Linux系统中在文本模式和二进制模式下并无区别
返回值
该函数返回一个FILE指针。否则返回NULL。
实例
下面的实例演示了
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); }
fclose( )函数的学习 (用来关闭一个由fopen( )函数打开的文件)
声明
int fclose(FILE *stream);
返回值
返回一个整型数 。当文件关闭成功时, 返回0, 否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
fgetc( )函数的学习(从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。)
声明
int fgetc(FILE *stream)
参数
stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。
返回值
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
fputc( )函数的学习( 用来把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。)
声明
int fputc(int char, FILE *stream)
参数
char --这是要被写入的字符。该字符以其对应的 int 值进行传递。
stream --这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
返回值
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。
四.register的学习
- register 就是CPU寄存器的意思,这个里面的变量要比放在内存里读取快很多
- 但是
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);/*关闭目标文件*/
}
简单的文本文件加密小程序相关推荐
- 简单描述下微信小程序的相关文件类型?
简单描述下微信小程序的相关文件类型? 微信小程序项目结构主要有四个文件类型,如下: .WXML 是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构.内部主要是微信自己定义的一套组件 ...
- 编写一个随机抽奖程序php,基于PHP实现简单的随机抽奖小程序
摘要:一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身.然后随即生成一个0到最大数之间的一个数,通过循 ...
- 随机循环抽奖小程序_c语言,基于JavaScript实现简单的随机抽奖小程序
对于抽奖这样的小程序使用诸如VB,Delphi等工具来实现会比较的方便,由于本人机器上没有装这样的应用程序,所以只能另寻其道.为了使抽奖程序能够无需配置平台直接可以在任何一台机器上运行,开发工具和编译 ...
- 多功能工具箱微信小程序源码下载-操作简单实用流量主小程序
这是一款多功能工具箱小程序! 目前由N款小功能组合成 比如: 图片拼接 九宫格切图 透明昵称 文字表情 等等上面说的只是一部分 该款小程序无需服务器与域名 使用微信开发者工具打开文件然后上传提交审核即 ...
- 简单有趣的matlab小程序_超实用有趣的五个小程序推荐
大家好,我是小胖. 废话不多说,进入正题. 1.一周CP共读 有趣的灵魂总会相遇. 一个极简的社交小程序. 通过选择自己喜欢的一本书,匹配到那个跟自己有着一样有趣灵魂的TA. 选择好要阅读哪本书之后, ...
- python3+opencv+tkinter开发简单的人脸识别小程序
学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...
- 简单的python有趣小程序-【实战案例】利用Python做出趣味版防沉迷小程序
今天带领大家利用Python做出趣味版防沉迷小程序 查询电脑的所有进程 用Python循环检测电脑软件的运行情况,当发现游戏软件时弹出警告窗口,并截图保存.学会这项技能,就再也不怕孩子偷偷打游戏了.下 ...
- 实战|轻松用 Python 开发一个简单有趣的聊天小程序
前言 Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol). UDP 为应用程序提供了一种无需建立连接就可以发送封装的 I ...
- 简单php抽奖,基于PHP实现简单的随机抽奖小程序_PHP
一个抽奖小程序,概论可控,也可某个奖品在前端显示,而程序中根本不可能获得!把所有的概率x10后相加起来,新数组中每项的值等于它前几个的和加上它本身. 然后随即生成一个0到最大数之间的一个数,通过循环查 ...
最新文章
- WPF加载相对路径的图片的解决方法
- Android开发之5.0已以上版本沉浸式状态栏
- python求偏度系数_用 Python 讲解偏度和峰度
- 深度学习(七十二)tensorflow 集群训练
- Android插件GsonFormat
- Matlab中句柄类
- 主流反外挂技术的优缺点比较
- ppt太大如何压缩到最小
- 截止失真放大电路_常用音响技术:音频功放失真及改善方法
- Samba————Linux与windows共享文件
- iOS苹果超级签苹果分发平台企鹅:422903005
- SpringDataJPA(二):SpringDataJPA的运行原理以及基本操作
- Java 线程池常见误区
- “OXO”历史上最早开发的电子游戏——游戏编年史
- 互联网摸鱼日报(2022-10-08)
- 在linux服务器上用headless firefox打开中文网页,字体乱码问题
- 培训机构让Github的含金量降低了?
- pixi 小游戏_PIXI兼容微信小游戏
- TK:安全的核心仍在于重视 移动安全应更多的考虑耦合风险
- Eclipse 3.6 M7(太阳神版)发布
热门文章
- 判断IE关闭还是刷新
- canal下载 linux_阿里canal数据库同步ES使用
- 结巴分词关键词相似度_辨别标题党--提取关键词与比较相似度
- vba 字体颜色_VBA第一章自检,23关,你能破吗?
- 医学数字成像设备中计算机系统的作用包括,医学影像实用技术教程全部习题答案...
- Win-MASM64汇编语言-DUP/TIMES
- Kafka-partition
- linux 网络定时断链,客户端连接linux经常间隔性断开链接
- 将系统升级为鸿蒙11.1系统,即将脱胎换骨!EMUI11.1升级名单遭曝光,或要和跟安卓说再见...
- enet分割_论文阅读 | CVPR 2016 | 语义分割论文: ENet