如何从 getc 阅读过去的 EOF

How to read past EOF from getc?

本文关键字:过去 EOF getc      更新时间:2023-10-16

我正在编写一个XOR加密程序,该程序在加密过程中工作正常,但在解密过程中工作正常这

char ca2=fgetc(f);

卡在某一点并且之后没有解密 我对这个问题的最佳猜测是(加密文件包含各种字符)一旦 fgetc 达到 EOF 标记,该标记可以在文件的实际结束之前存在,它就会卡在那里并停止读取下一个字符。

这是 getc() 的某种限制吗? 这是我的垃圾代码

int get_file_size(char  filename[]) 
{
    FILE *p_file = NULL;
    p_file = fopen(filename,"rb");
    fseek(p_file,0,SEEK_END);
    int size = ftell(p_file);
    fclose(p_file);
    return size;
}
int endec(char filename[],char psdw[])
{
    FILE *f;
    int hashed=0,ed=0;
    int inphash=inhash(psdw);
    inphash=inphash%50;
    f=fopen(filename,"r");
    if(f==NULL)
    printf("failed");
    char temps[999999];
    long int crs=0,j=0;
    int filesz=get_file_size(filename);
    printf("file size = %dnn",filesz);
while(1){
    inphash=inphash+2;
    char ca=(char)inphash;
    char ca2=fgetc(f);
    printf("%cn",ca2);
    if(crs>=filesz)
        break;
    temps[crs]= ca2 ^ ca;
    crs++;
        }
fclose(f);
printf("%d",strlen(temps));
FILE *fp;
fp=fopen(filename,"wt");
for(j=0;j<crs;j++){
        putc (temps[j] , fp);
printf("%c",temps[j]);
}
fclose(fp);
}

你的问题就在这里:

f=fopen(filename,"r");

打开文件是为了阅读文本,而不是用于二进制。 文件大小函数正确,但解码器函数不正确。

使用 C 样式 IO 例程逐个字符读取文件的惯用方法如下所示:

f = fopen(filename, "rb");
if (!f)
    // handle error
int c;   // NOTE:  int, not char!
while ( (c = fgetc(f)) != EOF )
{
    // do something with 'c'
}

此成语不需要您将文件大小作为单独的操作来获取。 您可以使用上述形式的简单循环重写 XOR "加密"例程。 它会更清晰、更简洁。

您的整个解码器函数可以重写如下:(减去调试代码)

int endec(char filename[], char psdw[])
{
     int inphash = inhash(psdw) % 50;
     char temp[999999];  // really, should be std::vector<char>
     FILE *f;
     if ( (f = fopen(filename, "rb")) == NULL )
     {
         printf("opening for read failedn");
         return -1;
     }
     size_t crs = 0;
     int    c;
     while ( (c = fgetc(f)) != EOF )
     {
         inphash += 2;
         temp[crs++] = (char)(inphash ^ c);
     }
     fclose(f);
     if ( (f = fopen(filename, "wt")) == NULL )
     {
         printf("opening for write failedn");
         return -1;
     }
     if (fwrite(temp, crs, 1, f) != crs)
     {
         printf("short writen");
         fclose(f);
         return -1;
     }
     fclose(f);
     return 0;
 }

不是出色的错误处理,但它是错误处理。