Бесконечный цикл while при чтении файла - PullRequest
1 голос
/ 04 марта 2012

Я получаю бесконечный цикл (в то время как цикл) с этой функцией.Я новичок в работе с файлами, поэтому я чувствую, что что-то упустил ... Я не вижу, что не так.

1 Ответ

3 голосов
/ 04 марта 2012

Побочным эффектом вызова 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.

...