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,所以 ~-10).

简单地说:

int ch;
while ( (ch = fgetc(fs)) != EOF )
    int decoded = ~ch;