What is the data type of FILE
in C or in other language?
Is it an integer or structure or having no particular data type?
FILE
in C or in other language?Is it an integer or structure or having no particular data type?
It is what is typically termed an opaque data type, meaning it's typically declared as a simple structure, and then internally in the OS libraries the FILE
pointer is cast to the actual date-type of the data-structure that the OS will use access data from a file. A lot of these details are system-specific though, so depending on the OS, the definition may differ.
struct xyzzy
in both the caller and the implementation, but only the implementation has access to the members of the struct. –
Iatrogenic T*
to U*
and back to T*
, and provided the alignment is correct, the standard specifically states this is not undefined behavior. So the library creates an internal T*
, passes the user from the library function an opaque type U*
through a cast... The user does not dereference this pointer, but passes it back to the library in another call, at which point the library recasts it to the original internally defined non-opaque T*
... That is not UB. –
Siegfried It's a typedef to a structure containing data about the state of the file handle. The exact contents of the structure are system-specific, but on my system (Mac OS X) it's defined as follows:
/*
* stdio state variables.
*
* The following always hold:
*
* if (_flags&(__SLBF|__SWR)) == (__SLBF|__SWR),
* _lbfsize is -_bf._size, else _lbfsize is 0
* if _flags&__SRD, _w is 0
* if _flags&__SWR, _r is 0
*
* This ensures that the getc and putc macros (or inline functions) never
* try to write or read from a file that is in `read' or `write' mode.
* (Moreover, they can, and do, automatically switch from read mode to
* write mode, and back, on "r+" and "w+" files.)
*
* _lbfsize is used only to make the inline line-buffered output stream
* code as compact as possible.
*
* _ub, _up, and _ur are used when ungetc() pushes back more characters
* than fit in the current _bf, or when ungetc() pushes back a character
* that does not match the previous one in _bf. When this happens,
* _ub._base becomes non-nil (i.e., a stream has ungetc() data iff
* _ub._base!=NULL) and _up and _ur save the current values of _p and _r.
*
* NB: see WARNING above before changing the layout of this structure!
*/
typedef struct __sFILE {
unsigned char *_p; /* current position in (some) buffer */
int _r; /* read space left for getc() */
int _w; /* write space left for putc() */
short _flags; /* flags, below; this FILE is free if 0 */
short _file; /* fileno, if Unix descriptor, else -1 */
struct __sbuf _bf; /* the buffer (at least 1 byte, if !NULL) */
int _lbfsize; /* 0 or -_bf._size, for inline putc */
/* operations */
void *_cookie; /* cookie passed to io functions */
int (*_close)(void *);
int (*_read) (void *, char *, int);
fpos_t (*_seek) (void *, fpos_t, int);
int (*_write)(void *, const char *, int);
/* separate buffer for long sequences of ungetc() */
struct __sbuf _ub; /* ungetc buffer */
struct __sFILEX *_extra; /* additions to FILE to not break ABI */
int _ur; /* saved _r when _r is counting ungetc data */
/* tricks to meet minimum requirements even when malloc() fails */
unsigned char _ubuf[3]; /* guarantee an ungetc() buffer */
unsigned char _nbuf[1]; /* guarantee a getc() buffer */
/* separate buffer for fgetln() when line crosses buffer boundary */
struct __sbuf _lb; /* buffer for fgetln() */
/* Unix stdio files get aligned to block boundaries on fseek() */
int _blksize; /* stat.st_blksize (may be != _bf._size) */
fpos_t _offset; /* current lseek offset (see WARNING) */
} FILE;
struct __sbuf
is a structure used internally by this implementation of stdio to store data buffers, defined as:
struct __sbuf {
unsigned char *_base;
int _size;
};
© 2022 - 2024 — McMap. All rights reserved.
man stdio
is not an answer. You can answer 90% of the questions on stackoverflow withman xxx
. – Antonioantoniusman stdio
I looked at had any significant information about whatFILE
looks like internally. (Which is reasonable, given that it's an implementation detail, but still.) – Sapidstruct FILE;
in a header file (to reduce namespace pollution by not including<stdio.h>
) and I think it would work on most systems, but the standard don't require it. Definitely a valid question. But what do you mean with “or in other language”? This probably depends on the language and you only tagged it C and C++… – ConeyFILE
s? If so, is there anything useful you can do with them? – SapidFILE
structure in<stdio.h>
and having it forward-declared is that you need the full definition to declare aFILE
(or an array of them) yourself. So there's the connection. – SapidFILE
, but after having a look at the standard it's pretty clear: C99 7.19.1/C11 7.21.1, p.2 The types declared are […];FILE
which is an object type. So, it seems to be possible to declare arrays ofFILE
s. – Coney