2015-09-10 7 views
-1

Предположим, у меня есть указатель на файлЧто происходит, когда мы разыскиваем указатель FILE?

FILE* infile = fopen("<somefilepath", "r"); 

Теперь, когда я разыменования указателя файла в GDB, то я получаю

печать * входной_файл

│ $ 2 = {_flags = -72539000, _IO_read_ptr = 0x0 , _IO_read_end = 0x0,
│ _IO_read_base = 0x0, 0x0 = _IO_write_base, _IO_write_ptr = 0x0,
│ _IO_write_end = 0x0, 0x0 = _IO_buf_base, _IO_buf_end = 0x0,
│ _IO_save_base = 0x0, _IO_backup_base = 0x0, _IO_save_end = 0x0, _markers = 0x0,
│ _chain = 0x7ffff7dd41c0 < _IO_2_1_stderr_>, _fileno = 3, _flags2 = 0,
│ _old_offset = 0, _cur_column = 0, _vtable_offset = 0 «\ 000' , _shortbuf = "",
│ _lock = 0x6020f0, _offset = -1, __pad1 = 0x0, __pad2 = 0x602100, __pad3 = 0x0,
│ __pad4 = 0x0, __pad5 = 0, _mode = 0, _unused2 = ' \ 000 '}

Может кто-нибудь помочь мне понять, что это значит?

+0

Это то, что 'File' содержится в вашей реализации библиотеки. Если вам интересно, что означают все эти члены, ответ на этот вопрос будет слишком длинным, и оба слишком широкие и слишком специфичные для этого сайта. – molbdnilo

+0

То же самое и для любой другой структуры. – Olaf

ответ

3

C11 7.21.1/2 описывает FILE, как

... тип объекта, способный записывать всю информацию, необходимую для управления ручья, включая его индикатор позиции файла, указатель на связанных с ним буфером (если таковой имеется), индикатор ошибки, который записывает , произошла ли ошибка чтения/записи и указатель конца файла , который регистрирует, достигнут ли конец файла;

Но не упоминает конкретных членов. Вот реализация GLibC, что вы наблюдали (я удалил неиспользованные препроцессора ветви для ясности):

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; 
    int _flags2; 
    _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; 

    _IO_off64_t _offset; 
    void *__pad1; 
    void *__pad2; 
    void *__pad3; 
    void *__pad4; 
    size_t __pad5; 
    int _mode; 
    /* Make sure we don't get into trouble again. */ 
    char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; 
}; 
+0

спасибо! это именно то, что я искал! –

3

FILE * следует рассматривать как непрозрачное значение ... Разбирание на него будет зависящим от платформы/библиотеки (и, следовательно, не переносимым).

-1

FILE описан в стандарте C, раздел 7.21.1:

2 Типы, объявленные в size_t (описано в 7.19);

        ФАЙЛ

который является тип объекта, способного записывать всю информацию , необходимую для управления потоком, включая его индикатор позиции файла, в указатель на его ассоциированного буфера (если таковые имеются) , a индикатор ошибки, что записывает, произошла ли ошибка чтения/записи, и конец файла индикатор, который регистрирует, достигнут ли конец файла; ...

В вашем конкретном случае кажется, что вы используете glibc. Это реализация FILE можно найти в libio.h:

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 
}; 

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

Смежные вопросы