How to read past EOF from getc?

前端 未结 1 1690
不思量自难忘°
不思量自难忘° 2021-01-21 14:34

I am writing a XOR encryption program which works fine during encryption but during decryption the

char ca2=fgetc(f);

gets stuck a

相关标签:
1条回答
  • 2021-01-21 15:28

    Your problem is right here:

    f=fopen(filename,"r");
    

    You open the file for text reading, not for binary. Your file size function gets it right, but your decoder function does not.

    The idiomatic way to read a file character by character using the C-style IO routines is like this:

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

    This idiom does not require you to get the file size as a separate operation. You can rewrite your XOR "encryption" routine with a simple loop of the above form. It will be much clearer and more concise.

    Your entire decoder function could be rewritten as follows: (minus the debug code)

    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;
     }
    

    Not stellar error handling, but it is error handling.

    0 讨论(0)
提交回复
热议问题