2

暗号化中は問題なく動作しますが、復号化中は 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 = %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);
}
4

1 に答える 1

3

あなたの問題はここにあります:

f=fopen(filename,"r");

バイナリ用ではなく、テキスト読み取り用にファイルを開きます。あなたのファイルサイズ機能はそれを正しくしますが、あなたのデコーダー機能はそうではありません。

C スタイルの IO ルーチンを使用してファイルを 1 文字ずつ読み取る慣用的な方法は、次のようになります。

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

恒星のエラー処理ではありませんが、エラー処理です。

于 2013-12-24T09:10:23.807 に答える