Объемное расположение памяти файла или переменная?

#c #pointers

#c #указатели

Вопрос:

Я только начал узнавать об указателях и открытии файлов. Итак, когда я использую FILE тип данных для того, чтобы открыть существующий файл для чтения, указатель указывает на расположение файла в памяти или на переменное расположение памяти?

 #include <stdio.h> // I/O

int main(int argc, char const *argv[])
{
    FILE *fpointer = fopen("employees", "r");
    fclose(fpointer);

    return 0;
} 
  

Если указатель указывает на местоположение файла в памяти, когда я печатаю указатель, на выходе будет точное местоположение файла в памяти?

 printf("memory address: %pn", fpointer);
// i.e 0x55a5ca11a2a0
  

Комментарии:

1. Файла нет в памяти вашего процесса. Он находится на каком-либо устройстве хранения (например, на диске). Указатель файла указывает на структуру, которая содержит информацию о буферизации. При чтении файла он считывается фрагментами, которые хранятся в буфере. Когда требуется больше, выполняется вызов ввода-вывода для чтения дополнительной части файла.

2. @TomKarzes The file isn't in your process memory Да, я знаю. Но я думал, что переменная содержит местоположение файла, потому что для того, чтобы открыть его, ему нужно его местоположение. Полезно знать!

3. Файл представляет собой структуру для описания. Эта структура содержит все, что операционной системе нужно знать об этом файле. например, физическое местоположение на диске, текущий указатель на файл (который обычно является текущим (в Linux) inode файлом, буферы для ввода и вывода и т.д. Вызов fopen() возвращает указатель на экземпляр этой структуры. Эти экземпляры struct хранятся в массиве, и вызов open() возвращает индекс в этот массив.

Ответ №1:

Он не содержит «местоположение файла», он содержит дескриптор файла, который выдается операционной системой при открытии файла и позволяет вам читать и / или записывать из него.

FILE Структура включает в себя не только дескриптор, но и небольшой объем памяти, отведенный для буферов, для повышения производительности.

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

Вот пример определения:

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

  /* The following pointers correspond to the C   streambuf protocol. */
  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;
  int _flags2;
  __off_t _old_offset; /* This used to be _offset but it's too small.  */

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

  _IO_lock_t *_lock;
#ifdef _IO_USE_OLD_IO_FILE
};