Как читать прошлые EOF из getc?

Я пишу программу шифрования 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);
}

1

Решение

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

f=fopen(filename,"r");

Вы открываете файл для чтения текста, а не для двоичного. Ваша функция размера файла делает это правильно, а ваша функция декодера — нет.

Идиоматический способ чтения файла символ за символом с использованием процедур ввода-вывода в стиле C выглядит следующим образом:

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]