Держу пари, у вас есть FILE * pfile;
ранее в вашем коде, который вы не включили. Если он находится вне всех блоков и имеет статическую продолжительность хранения, он инициализируется значением NULL.
Когда у вас есть FILE * pfile = fopen(...
во внутреннем блоке, два pfile
это две разные вещи. Поэтому, что происходит:
Вы определяете pfile
в блоке и прекрасно его открываете. Затем вы достигаете конца блока, и он сбрасывается, как и любая другая локальная переменная в блоке.
У вас остался исходный pfile
, который вы никогда не открывали и не назначали ничего, и это, вероятно, будет NULL.
Во втором случае вы открываете файл и удаляете его, а затем у вас есть FILE * pfile
в той же области, что и оператор тестирования if
, и это тот, который вы тестируете, так что все в порядке .
Что вам нужно сделать, это определить pfile
только один раз, так как дополнительные определения могут вызвать ошибки компилятора или предоставить вам отдельные версии. Извлеките все FILE *
из своих внутренних блоков и просто все время пользуйтесь одним и тем же pfile
.