Что fopen() возвращает к указателю файла, если файл открыт?

Например, если мы объявим указатель файла fp и откройте файл как это:
FILE* fp = fopen("filename","w");

Если файл не открывается fopen возвращается NULL на указатель файла fp, Что хранится в указателе файла fp если файл открывается?

2 ответа

В проекте комитета C N1570 говорится об этом FILE*:

7.21.3 Файлы
...

  1. Адрес FILE объект, используемый для управления потоком, может быть значительным; копия FILE объект не должен служить вместо оригинала.

Указатель возвращается fopen() указывает на FILE структура и содержание этой структуры зависят от реализации (что означает, что они различны на разных платформах).

Даже если вы знаете содержание этой структуры в конкретной реализации, вы НЕ должны пытаться получить доступ к любому из ее членов или написать код, который зависит от ваших знаний об этих членах (даже если бы было возможно сделать это).

Со страницы руководства fopen()

После успешного завершения fopen() вернуть FILE указатель. Иначе, NULL возвращается и errno установлен, чтобы указать на ошибку.

что хранится в указателе файла, если файл открывается? fopen() возвращает FILE структура, которая является ничем иным, как псевдонимом структуры _IO_FILE

/* The opaque type of streams.  This is the definition used elsewhere.  */
typedef struct _IO_FILE FILE; /* FILE is nothing but a structure which is _IO_FILE */

Вы можете найти вышеуказанную информацию в заголовках Linux stdio.h, И информация о том, что struct_IO_FILE содержит можно найти в libio.h в Linux-машине, которая зависит от платформы, то есть она варьируется в зависимости от платформы, выглядит как показано ниже (открыть /usr/include/libio.h в терминале) на платформе Linux.

struct _IO_FILE {
  int _flags;           /* High-order word is _IO_MAGIC; rest is flags. */
#define _IO_file_flags _flags

  /* The following pointers correspond to the C++ streambuf protocol. */
  /* Note:  Tk uses the _IO_read_ptr and _IO_read_end fields directly. */
  char* _IO_read_ptr;   /* Current read pointer */
  char* _IO_read_end;   /* End of get area. */
  char* _IO_read_base;  /* Start of putback+get area. */
  char* _IO_write_base; /* Start of put area. */
  char* _IO_write_ptr;  /* Current put pointer. */
  char* _IO_write_end;  /* End of put area. */
  char* _IO_buf_base;   /* Start of reserve area. */
  char* _IO_buf_end;    /* End of reserve area. */
  /* The following fields are used to support backing up and undo. */
  char *_IO_save_base; /* Pointer to start of non-current get area. */
  char *_IO_backup_base;  /* Pointer to first valid character of backup area */
  char *_IO_save_end; /* Pointer to end of non-current get area. */

  struct _IO_marker *_markers;

  struct _IO_FILE *_chain;

  int _fileno;
#if 0
  int _blksize;
#else
  int _flags2;
#endif
  _IO_off_t _old_offset; /* This used to be _offset but it's too small.  */

#define __HAVE_COLUMN /* temporary */
  /* 1+column number of pbase(); 0 is unknown. */
  unsigned short _cur_column;
  signed char _vtable_offset;
  char _shortbuf[1];

  /*  char* _save_gptr;  char* _save_egptr; */

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};
Другие вопросы по тегам