关于文件的问题, 大家一起来研究。
我的程序实现的要求是这样的:我事先在E盘上建立了文件e.txt文件。目的是对他进行加解密,并把加解密的内容替换源文件中的内容(即加解密后的结果任然在e.txt文件中,当然是相同的密钥),程序编译通过了,但是结果却是把e.txt中的内容清空了。大家一起来,找错啊,我有些头大啊。希望版主看一下。/*……………some header files………………*/
#include "stdafx.h"
#include"stdio.h"
#include<iostream>
using namespace std;
#define MIN 32//从32到125是可以打印的字符
#define LENTH 94
/*…………globle variable……………………*/
char table[LENTH][LENTH];
/*…………statement……………………………*/
bool Init();// 初始化维吉尼亚方阵
bool Encode(char* key, char* source, char* destination);// 加密
bool Dncode(char* key, char* source, char* destination);// 解密
void on_jiami();
void on_jiemi();
/*…………………main function……………*/
int k1=0,k2=0;
char key1[256],key2[256];
int main(int argc, char* argv[])
{
if(!Init())
{
cout << "初始化错误!" << endl;
return 1;
}
int operation;
printf("\n");
while(1)
{
do
{
cout << "请选择一个操作:1. 加密; 2. 解密; -1. 退出\n";
cin >> operation;
}while(operation != -1 && operation != 1 && operation != 2);
if(operation == -1)
return 0;
else if(operation == 1)//加密
{
cout << "请输入密钥:";
cin >> key1;
on_jiami();
}
else if(operation == 2)//解密
{
cout << "请输入密钥:";
cin >> key2;
on_jiemi();
}
cout << endl;
}
printf("\n");
printf("Hello World!\n");
return 0;
}
void on_jiami()
{
//加密代码
Init();// 初始化维吉尼亚方阵
FILE *fp;
fp=fopen("e:\\e.txt","rb");//打开待加密的文件
if(fp==NULL)
{
printf("cannot open the file!\n");
}
char ch,string1[94]={'\0'}; //里面存放待加密的字符串并初始化
do
{
char string2[94]={'\0'};
int j=0;
int i=1;
ch=fgetc(fp);
while((i<94)&&(ch!=EOF))//每次从文件读93个字符,
{
i++;
string1[j]=ch;
j++;
ch=fgetc(fp);
}
string1[93]='\0';
Encode(key1, string1, string2);//加密
fclose(fp);
fp=fopen("e:\\e.txt","rb+");
fseek(fp,1L*k1,SEEK_SET);
fputs(string2,fp);
fclose(fp);
fp=fopen("e:\\e.txt","rb");
k1=k1+strlen(string1);
fseek(fp,1L*k1,SEEK_SET);
}while(ch!=EOF);//直到文件的结束
fclose(fp);
}
void on_jiemi()
{
//解密代码
Init();// 初始化维吉尼亚方阵
FILE *fp;
fp=fopen("e:\\e.txt","rb");//打开待解密的文件
if(fp==NULL)
{
printf("cannot open the file!\n");
}
char ch,string1[94]={'\0'}; //里面存放待解密的字符串并初始化
do
{
char string2[94]={'\0'};
int j=0;
int i=1;
ch=fgetc(fp);
while((i<94)&&(ch!=EOF))//每次从文件读93个字符,
{
i++;
string1[j]=ch;
j++;
ch=fgetc(fp);
}
string1[93]='\0';
Dncode(key2, string1, string2);//解密
fclose(fp);
fp=fopen("e:\\e.txt","rb+");
fseek(fp,1L*k2,SEEK_SET);
fputs(string2,fp);
fclose(fp);
fp=fopen("e:\\e.txt","rb");
k2=k2+strlen(string2);
fseek(fp,1L*k2,SEEK_SET);
}while(ch!=EOF);//直到文件的结束
fclose(fp);
}
// 初始化维吉尼亚方阵
bool Init()
{
int i, j;
for(i = 0; i < LENTH; i++)
{
for(j = 0; j < LENTH; j++)
{
table[i][j] = MIN + (i + j) % LENTH;
}
}
return true;
}
// 加密
// key:密钥
// source:待加密的字符串
// dest:经过加密后的字符串
bool Encode(char* key, char* source, char* destination)
{
char* tempSource = source;
char* tempKey = key;
char* tempDest = destination;
do
{
*tempDest = table[(*tempKey) - MIN][(*tempSource) - MIN];
tempDest++;
if(!(*(++tempKey)))
tempKey = key;//密钥的重复
}while(*tempSource++);//直到明文到最后一个字符为止
destination[strlen(source)] = '\0';
return true;
}
// 解密
// key:密钥
// source:待解密的字符串
// dest:经过解密后的字符串
bool Dncode(char* key, char* source, char* destination)
{
char* tempSource = source;
char* tempKey = key;
char* tempDest = destination;
char offset;
do
{
offset = (*tempSource) - (*tempKey);
offset = offset >= 0 ? offset : offset + LENTH;
*tempDest = MIN + offset;
tempDest++;
if(!(*(++tempKey)))
tempKey = key;
}while(*++tempSource);
destination[strlen(source)] = '\0';
return true;
}
我刚刚就大家给出的意见,对文件做了局部的修改,文件可以运行,编译可以通过。也可以加解密,就是相同的加密密钥,加解密的结果是不同的,好像字符的个数也有问题。有兴趣的可以一同讨论。韩明海和南国利剑的建议不错。13楼的zhujianiu的意见也不错。希望大家帮帮忙。
我又从新编辑了代码。为最后的正确代码。谢谢大家的意见。
[ 本帖最后由 xueyuhanhai 于 2010-5-26 10:41 编辑 ]