首先,我是C的新手。
我偶然发现了一个例子,它要求用户解密一个c文件(其中包含1个补充的另一个c文件)。
通常,您可以使用以下语句复制字符
while ((ch = fgetc(fs)) != EOF)
但我在解密文件时遇到了麻烦。我尝试了以下内容 -
while (~(ch = fgetc(fs)) != EOF)
结果是 - 程序进入无限循环。我尝试使用EOF的ASCII值(即26),但即使这样也不利于我。
任何帮助将不胜感激。提前谢谢。
/ *解密文件的程序* /
以下是完整代码 -
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *fs, *ft;
char ch;
fs = fopen("xyz.c", "r");
ft = fopen("xyz1.c", "w");
if((fs == NULL) || (ft == NULL))
{
printf("Cannot open the file.\n");
exit(1);
}
while (~(ch = fgetc(fs)) != EOF)
fputc(~ch, ft);
fclose(fs);
fclose(ft);
}
答案 0 :(得分:2)
EOF是一个标记,表示已到达文件(或流)的末尾。现在,您不会处理此类标记 - 您无法对其进行修改(或在此情况下对其进行加密),因为它由内部文件系统进行内部管理。
因此,检查~EOF
在逻辑上是错误的,并且只捕获该特定值(EOF
-1
在大多数实现中都是如此,因此~-1
为0
)。
简单地:
int ch;
while ( (ch = fgetc(fs)) != EOF )
int decoded = ~ch;
答案 1 :(得分:0)
您需要将返回的值fgetc(fs)
与EOF
进行比较。只有在完成比较后才会将~
运算符应用于
将~
应用于fgetc()
的结果会导致问题。例如,如果您阅读'a'
字母,则ch
(需要int
而不是char
)的值将为97
(假设基于ASCII的系统)。 ~97
将是一个非常大的负数,可能大约在20亿左右。您只需要抓取结果的低位。