C编程 - 文件结尾的1

时间:2016-04-26 15:18:53

标签: c eof

首先,我是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);
    }

2 个答案:

答案 0 :(得分:2)

EOF是一个标记,表示已到达文件(或流)的末尾。现在,您不会处理此类标记 - 您无法对其进行修改(或在此情况下对其进行加密),因为它由内部文件系统进行内部管理。

因此,检查~EOF在逻辑上是错误的,并且只捕获该特定值(EOF -1在大多数实现中都是如此,因此~-10 )。

简单地:

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

答案 1 :(得分:0)

您需要将返回的值fgetc(fs)EOF进行比较。只有在完成比较后才会将~运算符应用于

~应用于fgetc()的结果会导致问题。例如,如果您阅读'a'字母,则ch(需要int而不是char)的值将为97 (假设基于ASCII的系统)。 ~97将是一个非常大的负数,可能大约在20亿左右。您只需要抓取结果的低位。