Что fopen () возвращает к указателю файла, если файл открыт? - PullRequest
0 голосов
/ 24 ноября 2018

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

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

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

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

7.21.3. Файлы
...

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

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

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

0 голосов
/ 24 ноября 2018

На странице руководства 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
};
...