C编程-1';s文件结尾的补码

C编程-1';s文件结尾的补码,c,eof,C,Eof,首先,我是C语言的新手 我偶然发现了一个示例,它要求用户解密一个c文件(其中包含1对另一个c文件的补充) 通常,您会使用以下语句复制字符 while ((ch = fgetc(fs)) != EOF) 但是我在解密文件时遇到了麻烦。我尝试了以下方法- while (~(ch = fgetc(fs)) != EOF) 结果是-程序将进入无限循环。我尝试使用EOF的ASCII值(26),但即使这样也不利于我 任何帮助都将不胜感激。提前谢谢 /*用于解密文件的程序*/ 以下是完整

首先,我是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);
    }
#包括
#包括
void main()
{
文件*fs,*ft;
char ch;
fs=fopen(“xyz.c”,“r”);
ft=fopen(“xyz1.c”,“w”);
如果((fs==NULL)| |(ft==NULL))
{
printf(“无法打开文件。\n”);
出口(1);
}
而(~(ch=fgetc(fs))!=EOF)
fputc(~ch,ft);
fclose(fs);
fclose(ft);
}

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


~
应用于
fgetc()
的结果将导致问题。例如,如果您读取字母
'a'
ch
(需要是
int
,而不是
char
)的值将是
97
(假设是基于ASCII的系统)<代码>~97将是一个非常大的负数,大概在-20亿左右。您只需要获取结果的低位。

您需要将返回到
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;

EOF是一个标记,表示已到达文件(或流)的结尾。现在,这样的标记不是由您处理的——您不能修改它(在本例中是加密它),因为它是由底层文件系统内部管理的

因此,检查
~EOF
在逻辑上是错误的,只会捕获该特定值(
EOF
在大多数实现中是
-1
,因此
~-1
0

简单地说:

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

EOF
不是字符。这是一种流状态,一旦由于文件结尾处出现读取失败,
getchar()
将返回
EOF
。它不会是你解密的内容的一部分(即,你不需要补充它)更新你的问题以显示你正在使用的实际代码<代码>而((~ch)=fgetc(fs))!=EOF)不会编译;作业的左侧不能有
(~ch)
。您是如何声明
ch
?我已用我的代码更新了问题。布莱克在评论中回答了这个问题。
EOF
不是一个字符。这是一种流状态,一旦由于文件结尾处出现读取失败,
getchar()
将返回
EOF
。它不会是你解密的内容的一部分(即,你不需要补充它)更新你的问题以显示你正在使用的实际代码<代码>而((~ch)=fgetc(fs))!=EOF)不会编译;作业的左侧不能有
(~ch)
。您是如何声明
ch
?我已用我的代码更新了问题。布莱克在评论中回答了这个问题。谢谢你,基思。。但正如“black”所指出的->EOF是一个标记,由内部管理。。所以我应该使用相同的first-while循环来比较EOF,并对while循环中的其余字符使用first-complete。它对我有用。谢谢though@Ashish当前位置是的,我差不多就是这么说的。我的错。一开始我不理解你的评论。谢谢你,基思。。但正如“black”所指出的->EOF是一个标记,由内部管理。。所以我应该使用相同的first-while循环来比较EOF,并对while循环中的其余字符使用first-complete。它对我有用。谢谢though@Ashish当前位置是的,我差不多就是这么说的。我的错。一开始我不理解你的评论。不过谢谢:)