*BSD News Article 66906


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.mira.net.au!inquo!in-news.erinet.com!imci5!imci4!newsfeed.internetmci.com!btnet!zetnet.co.uk!dispatch.news.demon.net!demon!microl4.microlise.UUCP!news
From: andrewg@microlise.co.uk    (Andrew Gierth)
Newsgroups: comp.unix.bsd.misc,alt.unix.wizards,comp.unix.misc
Subject: Re: How to write end of file character into file??!
Date: 24 Apr 1996 18:08:10 GMT
Organization: Microlise Engineering Ltd.
Lines: 54
Message-ID: <4llqma$71u@microl4.microlise.UUCP>
References: <xsvarshney-0604962038290001@newshub.csu.net> <4ktvmc$5d6@is05.micron.net> <4kuonh$q2@anorak.coverform.lan> <4l5le1$amd@is05.micron.net> <4l85m7$fjs@sv024.SanDiegoCA.ATTGIS.COM> <4lg9i8$8if@is05.micron.net>
Reply-To: andrewg@microlise.co.uk  (Andrew Gierth)
NNTP-Posting-Host: andrewg.microlise.uucp
X-NNTP-Posting-Host: microl.demon.co.uk
X-Newsreader: IBM NewsReader/2 v1.2
Xref: euryale.cc.adfa.oz.au comp.unix.bsd.misc:838 alt.unix.wizards:3718 comp.unix.misc:22213

In <4lg9i8$8if@is05.micron.net>, dwight@micron.net (Dwight Tovey) writes:
[previous context snipped]
>At any rate, what I was trying to point out (possibly not very well) is that
>testing for the EOF "value" can cause problems.  I have seen code similar to the
>following:

[code snipped - others have already commented on it]

>However the following
>code will go to the "real" end of the file for both binary and text files:
>
>       char ch;
>       FILE *fp
>
>       fp = fopen( "foo", "r" );
>       while( !feof( fp )) {
>               ch = fgetc(fp);
>               putchar( ch );
>       }
>
>Once again, I don't claim that the code I am showing here is the "best" way to do
>anything.  My only intention is to point out that testing for the "EOF character"
>on a read can lead to confusion when you get a file that has non-text data.

It certainly is not the best way! It is not even a correct way. You
have conclusively proved that it is just as easy to get confused about
end-of-file when using feof() as when using fgetc().

Observe the final iteration of your loop:

   feof(fp)     returns false
   fgetc(fp)    returns EOF
   (char)EOF    stored into ch
   putchar(ch)  writes (char)EOF to stdout (y-umlaut if using ISO8859/1)
   feof(fp)     returns true; loop exits.

Remember, feof() returns true only *after* you have attempted to
read past the end-of-file.

>FWIW: I have worked in Unix for more than a few years, including porting Unix
>kernel & library routines to different platforms.  I still don't claim to be an
>"expert" at anything, but I do have a passing familiarity with some of it.
>       /dwight

I hope you regard this as an opportunity to improve on your
'passing familiarity'. This is (amongst others) alt.unix.WIZARDS,
after all...

-- Andrew  (andrewg@microlise.co.uk)

"How is this place run - is it an anarchy?"
"No, I wouldn't say so; it is not that well organised..."