【问题标题】:How to read past EOF from getc?如何从 getc 读取过去的 EOF?
【发布时间】:2014-01-12 12:33:29
【问题描述】:

我正在编写一个 XOR 加密程序,该程序在加密期间但在解密期间工作正常

char ca2=fgetc(f);

卡在某一点上,之后就没有解密发生了它卡在那里并停止读取下一个字符。

这是 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 = %d\n\n",filesz);
while(1){

    inphash=inphash+2;
    char ca=(char)inphash;
    char ca2=fgetc(f);
    printf("%c\n",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);
}

【问题讨论】:

    标签: c++ file fgetc getc


    【解决方案1】:

    你的问题就在这里:

    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 failed\n");
             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 failed\n");
             return -1;
         }
    
         if (fwrite(temp, crs, 1, f) != crs)
         {
             printf("short write\n");
             fclose(f);
             return -1;
         }
    
         fclose(f);
         return 0;
     }
    

    不是stellar错误处理,而是错误处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 2017-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多