FILE structure in stdio.h

Joseph S. D. Yao jsdy at hadron.UUCP
Wed Nov 23 01:24:44 AEST 1988


In article <17521 at adm.BRL.MIL> Pabbisetty.henr at xerox.com (Nagesh Pabbisetty) writes:
>Could someone tell me 
>	1."what" is stored in each of these fields? OR
>	2. What is their significance.
>Nagesh

Henry is absolutely right.  Their definition and meaning may change at
any moment, and you should not need to use them directly.  That's the
whole point of "information hiding" within the stdio module.  However,
(a) curiosity is legitimate, and (b) there are ways to use them even
through the protective screen of the stdio module.

>extern  struct  _iobuf {
>	int     _cnt;
	The number of characters read and not transferred to the
	program, or transferred from the program and not written.
	Only to be set by getc()/_filbuf() or putc()/_flsbuf(), or
	their near and dear relatives.

>	unsigned char *_ptr;
	Pointer to the next byte to be gotten or empty space into
	which to be written.  Same caveats as above.

>	unsigned char *_base;
	Pointer to the first element of the I/O buffer proper.  This
	can be set by setbuf().  Non-standard interfaces to extend
	this functionality include setvbuf(), setbuffer(), and
	setlinebuf().  (Perhaps I should say non-uniform: these are
	the ones that, unlike setbuf(), are not yet universal to all
	versions of stdio.)

>	int     _bufsiz;
	This is the size of the buffer, in those versions of stdio
	that allow the buffer to be a size different from BUFSIZ.
	Warning: use of different buffer sizes may be incompletely
	implemented in your version.  I think it was System V Release
	2.0 Version 2 in which they forgot to fix fwrite().  I may be
	wrong.  (The above identification changed at least once before
	getting to you.)  This is set by one of the non-uniform
	variants of setbuf().  Once set, don't muck with it except as
	specified in your stdio interface definition (or setbuf manual
	entry).

>	short   _flag;
	These flags tell whether the buffer is read, write, or
	read/write; buffered, unbuffered, or (where relevant)
	line-buffered; whether an error or EOF has been seen; and
	other necessary information, per implementation.  If you
	value the sanity of your program, you will usually not mess
	with them.  If you want to know what flags were advertised
	(which is often the same as the set that is used in your
	implementation), grep "_IO" stdio.h.
	The two legitimate interfaces to this are macros or functions
	to test for EOF and error: feof() and ferror().

>	char    _file;          /* should be short */
	This is the Unix file descriptor - obviously meaningless if
	this is not a Unix-like system.  (Yes, I know about Suns.)
	If you really, really need to meddle with it, such as for
	stty() or one of the few other Unix functions for which there
	is not a stdio equivalent, you can access it via fileno().
	You set it via fopen(), or from an already existing Unix file
	descriptor by fdopen(), which is fairly uniformly implemented
	by now.  (It wasn't, in earlier versions.)

>} _iob[];

	Joe Yao		jsdy at hadron.COM (not yet domainised)
	hadron!jsdy@{uunet.UU.NET,dtix.ARPA,decuac.DEC.COM}
	arinc,att,avatar,blkcat,cos,decuac,dtix,\
	ecogong,empire,gong,grebyn,inco,insight, \!hadron!jsdy
	kcwc,lepton,netex,netxcom,phw5,rlgvax,	 /
	seismo,sms,smsdpg,sundc,uunet		/



More information about the Comp.unix.wizards mailing list