NetBSD-Users archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Re: Re: fgets() fails to read after fread()



Dear Jean-Yves,
Thanks for the inputs.
I have one doubt here, Is this check for sticky EOF in BSD system is according 
to the specification ? if Yes, then why this check is not for SysV 
implementation ?

Thank You,
Amol Pise 

On Tue, 31 Aug 2010 20:08:40 +0530  wrote
>

On Tue, 31 Aug 2010 16:19:19 +0200, Jean-Yves Migeon

 wrote:

> On 31 Aug 2010 10:01:45 -0000, "amol pise" 

> wrote:

>>[snip]

>> $ cat lib/libc/stdio/refill.c

>> {{{

>> 1 /*   $NetBSD: refill.c,v 1.13 2003/08/07 16:43:30 agc Exp $ */

>> :

>> + #if 0

>> 86     /* SysV does not make this test; take it out for

> compatibility

>> */

>> 87     if (fp->_flags & __SEOF)

>> 88         return (EOF);

>> + #endif

>> }}}

>> 

>> Doing the above modification is enough to work for SysV system ?

>> Please give me inputs on it.

>> 

>> Thank You,

> 

> Oops, I wasn't looking at the correct file...

> 

> Yes, removing the sticky EOF check should be enough.



Actually, according to ANSI C:



4.9.8.1 The fread function

[...]

The file position indicator for the stream (if

defined) is advanced by the number of characters successfully read.

If an error occurs, the resulting value of the file position indicator

for the stream is indeterminate.





=> So it seems that, if the initial fread() is incomplete (likely to be

your case for EOF), the position indicator is indeterminate. If you want to

be strictly portable, you would rather have to use clearerr() or fsetpos()

before attempting the fgets(), or check that the value returned by fread()

does match the one you passed to it as parameter (and adapt accordingly if

it is not equal).



Your call I guess :)



Cheers,



-- 

Jean-Yves Migeon

jean-yves.migeon%espci.fr@localhost


Home | Main Index | Thread Index | Old Index