C编程-文件结尾的1的补码
C programming - 1's complement of End of File
首先,我是 C 的新手。
我偶然发现了一个示例,它要求用户解密一个 c 文件(其中包含另一个 c 文件的 1 补码)。
通常,您会使用以下语句复制字符
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);
}
您需要将返回给 fgetc(fs)
的值与 EOF
进行比较。仅在 完成比较后 对其应用 ~
运算符。
并且将 ~
应用于 fgetc()
的结果将会导致问题。例如,如果您读取字母 'a'
,则 ch
的值(需要是 int
,而不是 char
)将是 97
(假设一个基于 ASCII 的系统)。 ~97
将是一个非常大的负数,可能在-20 亿左右。您只需要获取结果的低位。
EOF 是一个标记,表示已到达文件(或流)的末尾。现在,这样的标记不由您处理 - 您 不能 修改它(或加密它,在这种情况下),因为它由底层文件系统内部管理。
因此,检查 ~EOF
在逻辑上是错误的,只会捕获该特定值(EOF
在大多数实现中是 -1
,所以 ~-1
是 0
).
简单地说:
int ch;
while ( (ch = fgetc(fs)) != EOF )
int decoded = ~ch;
首先,我是 C 的新手。
我偶然发现了一个示例,它要求用户解密一个 c 文件(其中包含另一个 c 文件的 1 补码)。
通常,您会使用以下语句复制字符
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);
}
您需要将返回给 fgetc(fs)
的值与 EOF
进行比较。仅在 完成比较后 对其应用 ~
运算符。
并且将 ~
应用于 fgetc()
的结果将会导致问题。例如,如果您读取字母 'a'
,则 ch
的值(需要是 int
,而不是 char
)将是 97
(假设一个基于 ASCII 的系统)。 ~97
将是一个非常大的负数,可能在-20 亿左右。您只需要获取结果的低位。
EOF 是一个标记,表示已到达文件(或流)的末尾。现在,这样的标记不由您处理 - 您 不能 修改它(或加密它,在这种情况下),因为它由底层文件系统内部管理。
因此,检查 ~EOF
在逻辑上是错误的,只会捕获该特定值(EOF
在大多数实现中是 -1
,所以 ~-1
是 0
).
简单地说:
int ch;
while ( (ch = fgetc(fs)) != EOF )
int decoded = ~ch;