c语言从文件中读取数据

我搞了一个文件加密的程序,但是加密和解密后都会多出一个字符,我也没办法去除,求大神帮忙
加密
int add()
{
int i=0,num;
char name1[1024],name2[1024],c,key[1024],ch;
FILE *fp1,*fp2;
start:
Cl;
P("请输入要加密的文件名(带后缀):\n");
S("%s",name1);
if ((fp1=fopen(name1,"rb"))==NULL)
{
P("无法打开文件,或文件不存在!\n");
P("重新输入?(y/n)");
fflush(stdin);
S("%c",&c);
if (c=='y')
{
goto start;
}
else if (c=='n')
{
}
else
{
Cl;
P("错误!\n");
}
Pa;
}
start2:
P("请输入加密后需保存的文件名(带后缀):\n");
S("%s",name2);
if ((fp2=fopen(name2,"wb"))==NULL)
{
P("无法创建文件!\n");
P("重新输入?(y/n)");
fflush(stdin);
S("%c",&c);
if (c=='y')
{
goto start2;
}
else if (c=='n')
{
}
else
{
Cl;
P("错误!\n");
}
Pa;
}
P("请输入密码(请记住,解密需要):");
fflush(stdin);
S("%s",key);
P("正在加密\n");
num=strlen(key);
while (!feof(fp1))
{
ch=(getc(fp1)^key[i])+i;
putc(ch,fp2);
i++;
if (i>=num)
{
i=0;
}
}
end:
P("加密成功!\n");
fclose(fp1);
fclose(fp2);
i=0;
Pa;
}
解密
int jie()
{
int i=0,num;
char name1[1024],name2[1024],c,key[1024],ch;
FILE *fp1,*fp2;
start:
Cl;
P("请输入要解密的文件名(带后缀):\n");
S("%s",name1);
if ((fp1=fopen(name1,"rb"))==NULL)
{
P("无法打开文件,或文件不存在!\n");
P("重新输入?(y/n)");
fflush(stdin);
S("%c",&c);
if (c=='y')
{
goto start;
}
else if (c=='n')
{
}
else
{
Cl;
P("错误!\n");
}
Pa;
}
start2:
P("请输入解密后需保存的文件名(带后缀):\n");
S("%s",name2);
if ((fp2=fopen(name2,"wb"))==NULL)
{
P("无法创建文件!\n");
P("重新输入?(y/n)");
fflush(stdin);
S("%c",&c);
if (c=='y')
{
goto start2;
}
else if (c=='n')
{
}
else
{
Cl;
P("错误!\n");
}
Pa;
}
P("请输入密码:");
fflush(stdin);
S("%s",key);
P("正在解密\n");
num=strlen(key);
while (!feof(fp1))
{
ch=(getc(fp1)-i)^key[i];
putc(ch,fp2);
i++;
if (i>=num)
{
i=0;
}
}
end:
P("解密成功!\n");
fclose(fp1);
fclose(fp2);
i=0;
Pa;
}
有些函数我用宏定义了,比如printf--P,system("pause")--Pa,system("cls")--Cl
大体就不用改了,算法也最好别改

feof是按照内容判断是否是文件结尾,当最后一个字符读完之后,还没有设置结束标志,所以还会再读一次getc(),这次才判定结束,所以会多出来一个字符,正确写法是:在while()循环之前读一次fgetc(fp),在循环里处理完你的数据后加fgetc(fp)。追问

那能告诉我该怎么改吗?

追答

加密为例:
ch=getc(fp1);

while(feof(fp1))
{
ch=ch^key[i])+i;

putc(ch,fp2);

ch=fgetc(fp1);
i++;
if (i>=num)
{
i=0;
}
}
解密你自己写。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-03-31

相似回答