该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#ifdef __GNUC__
# include
#else
# include
#endif
int compess(FILE *fsrc, FILE *fdest, int n)
{
char buf[128], ch[256];
int count, num;
int i, j, k;
if (NULL == fsrc || NULL == fdest)
{
printf("参数错误,压缩失败!\n");
return -1;
}
while (0 != (num = fread(buf, 1, 128, fsrc)))
{
for (i = 0, j = 0; i < num; i++, j++)
{
if (buf[i] == ' ' && buf[i + 1] == ' ')
{
count = 0;
while (buf[i++] == ' ')
count++;
i -= 2;
ch[j] = '#';
for (k = 100; k > 0; k /= 10)
{
if (count / k != 0) ch[++j] = count / k + 48;
count %= k;
}
}
else
{
ch[j] = buf[i];
if (buf[i] == '#')
ch[++j] = '#';
}
}
fwrite(ch, 1, j, fdest);
}
return 0;
}
int restore(FILE *fsrc, FILE *fdest, int n)
{
char buf[128], ch[256];
int count, num;
int i, j, k;
if (NULL == fsrc || NULL == fdest)
{
printf("参数错误,还原失败!\n");
return -1;
}
while (0 != (num = fread(buf, 1, 128, fsrc)))
{
for (i = 0, j = 0; i < num; i++, j++)
{
if (buf[i] == '#' && buf[i + 1] != '#')
{
i++;
for (k = 0; k < buf[i] - 48; k++)
ch[j++] = ' ';
j--;
}
else
{
ch[j] = buf[i];
if (buf[i] == '#')
i++;
}
}
fwrite(ch, 1, j, fdest);
}
return 0;
}
int encrypt(FILE *fsrc, FILE *fdest, int n)
{
char buf[128];
int i, num;
if (NULL == fsrc || NULL == fdest)
{
printf("参数错误,加密失败!\n");
return -1;
}
while (0 != (num = fread(buf, 1, 128, fsrc)))
{
for (i = 0; i < num; i++)
{
if (buf[i] != '\n')
buf[i] += n;
}
fwrite(buf, 1, num, fdest);
}
return 0;
}
int decrypt(FILE *fsrc, FILE *fdest, int n)
{
char buf[128];
int i, num;
if (NULL == fsrc || NULL == fdest)
{
printf("参数错误,解密失败!\n");
return -1;
}
while (0 != (num = fread(buf, 1, 128, fsrc)))
{
for (i = 0; i < num; i++)
{
if (buf[i] != '\n')
buf[i] -= n;
}
fwrite(buf, 1, num, fdest);
}
return 0;
}
void menu()
{
int n, sel;
FILE *fp, *fp1;
char ch, buf[128];
char str[][16] ={"压缩", "解压", "加密", "解密"};
typedef int (*pfun)(FILE*, FILE*, int);
pfun func[] = {compess, restore, encrypt, decrypt};
LOOP:
#ifdef __GNUC__
system("clear");
#else
system("cls");
#endif
printf(" **************数据压缩与加解密系统 **************\n");
printf("\t1,------------> 压缩\n");
printf("\t2,------------> 解压\n");
printf("\t3,------------> 加密\n");
printf("\t4,------------> 解密\n");
printf("\t5,------------> 退出\n");
printf("\n选择要执行的操作:");
scanf("%d", &sel);
getchar();
if (sel >= 1 && sel <= 4)
{
INPUT:
printf(" 输入%s文件的名字(和位置):", str[sel - 1]);
gets(buf);
fp = fopen(buf, "r");
if (NULL == fp)
{
printf("输入的文件名有误,重新");
goto INPUT;
}
printf(" 输入%s后文件的名字(和位置):", str[sel - 1]);
gets(buf);
fp1 = fopen(buf, "w");
if (NULL == fp)
{
printf("打开文件失败,退成程序!\n");
fclose(fp);
return;
}
if (sel == 3 && sel == 4)
{
printf(" 请输入密匙(小于10 的整数):");
scanf("%d", &n);
}
(*func)(fp, fp1, n);
fclose(fp);
fclose(fp1);
}
else if (sel == 5)
return;
else
{
printf(" 选择错误,重新选择\n");
goto LOOP;
}
printf("完成操作,继续?(y/n)");
ch = getchar();
if (ch == 'y' || ch == 'Y')
goto LOOP;
}
int main()
{
menu();
return 0;
}