Что происходит с указателем FILE после закрытия файла? - PullRequest
11 голосов
/ 09 декабря 2011

Я хочу знать, что происходит с указателем FILE после закрытия файла. Это будет NULL?

В основном, я хочу проверить, был ли файл уже закрыт, прежде чем закрывать файл.

Например, следующим образом:

FILE *f;

if(f!=NULL)
{
  fclose(f);
}

Могу ли я сделать это или есть другой способ?

Ответы [ 4 ]

10 голосов
/ 09 декабря 2011

Поскольку аргументы передаются по значению, fclose не может установить указатель вашего файла на NULL.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}} * Не работает

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.если вы используете FILE **) Не попадайте в ситуацию, когда вы " забудете ", закрыли ли вы его или нет (может быть сложно)
7 голосов
/ 09 декабря 2011

Питер Норвиг цитаты Огюст Конт (1798-1857):

  "Nothing is destroyed until it is replaced"

Вы можете использовать макрос:

  #define fclose(fp)  ((fp) ? fclose(fp) : 0, (fp) = 0)

Это исправляет две различные и противоположные проблемы:

  • Указатель FILE * равен NULL после fclose, поэтому он можетt fclose'd дважды.

  • Эта версия fclose будет принимать аргумент NULL.Многие распространенные версии fclose - например, в HPUX, SGI и CYGWIN - довольны NULL.Странно, что версии, основанные на FreeBSD, такие как в Linux и Microsoft, не таковы.

Конечно, макрос создает свои собственные проблемы:

  • Не возвращает правильное значение ошибки.Но если вы хотите увидеть это, вы можете отключить макрос с дополнительными скобками, например: if ((fclose)(fp) == EOF){ /* handle error... */ }

  • У него нет семантики функции , так какон использует свой аргумент несколько раз.Но трудно представить, что это вызывает проблемы.Но вы можете использовать (fclose).Или назовите его FCLOSE, чтобы следовать соглашению.

2 голосов
/ 09 декабря 2011

FILE * Это указатель на структуру FILE, когда вы вызываете fclose (), это уничтожит / освободит структуру FILE, но не изменит значение FILE * указатель означает, что он все еще имеет адрес этой структуры FILE, которая сейчас невыходы.

То же самое происходит с любым указателем, полученным с помощью malloc

int a malloc(10);
free(a);

все равно a не будет NULL

, в большинстве случаев я всегда делаю это

free(a);
a=NULL;

Редактировать: вы не можете проверить, закрыто ли оно / освобождено в любое время.просто чтобы убедиться, что вы можете присвоить ему значение NULL после free / fclose, чтобы вы могли проверить его значение NULL или нет и продолжить.

0 голосов
/ 09 декабря 2011

Да, вы можете сделать это.и лучший способ - установить fp в NULL, в противном случае

это будет висячий указатель (указатель, указывающий на то, чем он не владеет или которого не существует)

...