2 u011818774 u011818774 于 2013.12.17 21:12 提问

c语言写的简单加密程序,看下哪儿错了

//实现如下
FILE *fp;
char data;
if((fp=fopen("D:\test.txt","r+"))==NULL)
{
printf("文件打开失败!");
exit(1);
}
data=fgetc(fp);
while(!feof(fp))
{
data=data^0x18;//加密原理,四五位取反
fseek(fp,-1,1);//回退一个字节
fputc(data,fp);//将加密后的字节写入文件
data=fgetc(fp);//取出下一个代加密,字节
}
fclose(fp);

1个回答

DoctorCZM
DoctorCZM   2013.12.19 17:03
已采纳

您的问题已经解决,我先将源码贴出来,然后讲解一下思路。

#include <stdio.h>

#include

int main()
{
//实现如下
FILE *fp = NULL;
char data, t;
if((fp=fopen("d:test.txt","r+"))==NULL)
{
printf("open file error!");
exit(1);
}

do
{
    data=fgetc(fp);
    t = data ^ 0x18;        //加密原理,四五位取反
    fseek(fp,-1,SEEK_CUR);  //回退一个字节
    fputc(t,fp);            //将加密后的字节写入文件
    fseek(fp, 0,SEEK_CUR);
    printf("%c", data);
}while(data != EOF);

fclose(fp);
return 0;

}

//abcdefghijklmnopqrstuvwxyz

关键在于:
data是用于获取字符,如果直接对其进行运算可能出现一些特殊的字符,这些字符可能会引起死循环。
另外,使用fseek进行回退后,应该使指针回到原处,这一点特别注意,这样才能保证不会出现死循环,最的字符是测试用例,在我的电脑上已经通过测试,希望能帮助到您!

DoctorCZM
DoctorCZM 您好,这个问题在我调试的时候我也遇到,如果注释掉fseek(fp,0,SEEK_CUR);这条语句在我电脑上测试出现死循环;如果改成fseek(fp,1,SEEK_CUR),则只有奇数字符加密了,其他字符不变;由这两个自然而然想到fseek(fp,0,SEEK_CUR)这种形式,至于为什么,我想应该在底层给fp重新赋值了。
接近 4 年之前 回复
u011818774
u011818774 非常,太,感谢你了。有一点还是不明白,fseek(fp,0,SEEK_CUR)不是将指针退回0个字节吗?那指针不是没动吗,感觉没有什么作用啊,求大神指教
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片