文本文件按行加密和解密这样可以保证文本文件的安全性,即使用文本文件丢失也不会造成文件内容的泄密。
按行加密有一点就是 \n 的转换 与一行的判断。因为是按行加密的,而一行的结束标识是 \n,字符串的结束标识是 \0 而当遇到 \n 时加密后的字符肯定不再是 \n 这样再解密时就没有办法判断这是一行的位置,因为这时没有 \n 的结束标识位了。这时我们手动处理 \n,因为\n 在文本文件中都是以 \r\n 替代 \n 这时我们判断遇到 \r 或 \n 就用 \0 替换。而这一行的密码后的 \n结识没了,这时我们把每一行加密码后的文本中手动加入 \n ,解密时按相同的方式进行处理,这样就能保证一行数据的完整读取了。
详见以下代码:
/*
按行加密这样文本不能名文显示,达到了安全性。而在查询时又可以使用按行解密查询。
*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void run(char *str)
{
/* 这里是把 \n 换成 \0 */
char *p = str;
while (*p != '\0')
{
if (*p == '\r' || *p == '\n')
{
*p='\0'; //替换
}
p++;
}
int length = strlen(str);
for (int i = 0; i < length; i++)
{
str[i] = str[i] ^ 5;
}
}
void jia(char *path)
{
FILE *pfr = fopen(path, "rb");
FILE *pfw = fopen("D:\\Ccode\\文件操作\\获取文件大小\\获取文件大小\\baidujia.txt", "wb");
if (pfr == NULL || pfw == NULL)
{
printf("文件打开或读失败!\n");
return;
}
else
{
while (!feof(pfr))
{
char str[256] = { 0 };
fgets(str, 255, pfr);
run(str);
fputs(str,pfw);
fputs("\n", pfw); //这是分成一行的标识,要不加密码出来的文本不有区分行。
}
}
fclose(pfr);
fclose(pfw);
}
void jie(char *path,char *findstr)
{
FILE *pfr = fopen(path, "rb");
//FILE *pfw = fopen("D:\\Ccode\\文件操作\\获取文件大小\\获取文件大小\\baidujie.txt", "wb");
if (pfr == NULL )
{
printf("文件打开或读失败!\n");
return;
}
else
{
while (!feof(pfr))
{
char str[256] = { 0 };
fgets(str, 255, pfr);
run(str);
char *res = strstr(str, findstr);
if (res)
{
printf("%s\n", res);
}
}
}
fclose(pfr);
}
char *path = "D:\\Ccode\\文件操作\\获取文件大小\\获取文件大小\\baidu.txt";
char *pathjia = "D:\\Ccode\\文件操作\\获取文件大小\\获取文件大小\\baidujia.txt";
void main()
{
//jia(path);
jie(pathjia,"张海娜");
system("pause");
}