Побочным эффектом вызова fseek()
является то, что указание EOF в файле очищается:
C99 7.19.9.2/5 Функция fseek:
После определения новой позиции успешный вызов функции fseek отменяет любые эффекты функции ungetc на поток, очищает индикатор конца файла для потока , а затем устанавливает новую должность.
Обратите внимание, что ваш код также использует общий антишаблон цикла, управляемого функцией feof()
. Эта функция не вернет EOF
до тех пор, пока после операция ввода-вывода не приведет вас к этой точке (устанавливает индикатор конца файла). Другими словами, даже когда вы входите в цикл, fgetc()
может потерпеть неудачу из-за того, что находится в конце файла (это то, что будет устанавливать индикатор конца файла). Но затем последующий поиск очистит этот индикатор. Тем временем вы будете оперировать с EOF
, как если бы это было нормальное успешное чтение.
См:
Возможно, вы захотите попробовать следующий цикл:
int c;
while((c = fgetc(password_ptr)) != EOF)
{
int en= c+n;
fseek(password_ptr, -1, SEEK_CUR); // move backwards one character
if(fputc(en,password_ptr)!=en)
{
printf("Error:fputc didn't work");
break;
}
}
Вам также нужно подумать о том, как вы хотите, чтобы этот бит кода обрабатывал ситуацию, когда en
находится вне диапазона unsigned char
. Так как fputc()
преобразует символ для записи в unsigned char
перед записью его в поток, если en
находится вне этого диапазона, будет отображаться ошибка «fputc не работает». Это может произойти, например, если добавление n
к символу, считанному с fgetc()
, больше 255.