2013-12-24 4 views
1

Я пишу программу шифрования XOR, который отлично работает во время шифрования, но при расшифровке Как читать прошлый EOF из getc?

голец ca2 = fgetc (е);

застревает в одной точке и не расшифровка не происходит после того, что моя догадка о задаче (зашифрованный файл содержит все виды символов), как только 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); 
} 

ответ

3

Ваша проблема здесь:

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

Не звездной обработка ошибки, но обработка ошибок.