By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,194 Members | 884 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,194 IT Pros & Developers. It's quick & easy.

while statement

P: n/a
I have a logical error in my program, I have submitted the program and
my tutor hasn't listed the other problems with the code, but said that
the program won't run because of a while statement.
The while statement is as follows.

while(infile.peek() != EOF)
{
infile.getline(temp1, max);

};

if statement

if statement

if statement

etc.

The code compilers ok, but the program won't run because (tutor's
explaination)
it is going to the end of the file and reading nothing.
I've tried enclosing all other statements within the while statement,
but that appears not to work. Like so:

while(infile.peek() != EOF)
{
infile.getline(temp1, max);

if statement

if statement

if statement

etc.

};

If anyone could help I would be extremely grateful.
Jul 19 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
muser wrote:
I have a logical error in my program, I have submitted the program and
my tutor hasn't listed the other problems with the code, but said that
the program won't run because of a while statement.
The while statement is as follows.

while(infile.peek() != EOF)
{
infile.getline(temp1, max);

};
[snip]If anyone could help I would be extremely grateful.


The peek() method of istream may not return an EOF value. The peek()
method returns the next character in the stream and fails if there
isn't one or the stream failed while trying. Some filesystems don't
have a character that represents EOF. Some MSDOS systems used the
value of 0x1a for an EOF marker, while others used 0x04 (EOT).

Use the good(), fail(), bad() methods for checking if a
stream has reached EOF.

Read this section of the FAQ:
http://www.parashift.com/c++-faq-lite/input-output.html

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

Jul 19 '05 #2

P: n/a
"John Harrison" <jo*************@hotmail.com> wrote in
news:bd************@ID-196037.news.dfncis.de:

"Thomas Matthews" <th*************@sbcglobal.net> wrote in message
news:3E**************@sbcglobal.net...
muser wrote:
> I have a logical error in my program, I have submitted the program
> and my tutor hasn't listed the other problems with the code, but
> said that the program won't run because of a while statement.
> The while statement is as follows.
>
> while(infile.peek() != EOF)
> {
> infile.getline(temp1, max);
>
> };
>

[snip]
>If anyone could help I would be extremely grateful.


The peek() method of istream may not return an EOF value.


peek is defined to return EOF on end of file (assuming infile is
derived from istream, or iostream).

I see no logical error with the OP's code, but Jon's suggestion is
undoubtedly cleaner.

john


I think the most concise, and foolproof way to do this is just:

while(!infile.getline(temp1, max).eof());

this is valid since getline returns a reference to the stream.
the only downside is addition of a function call, but that's
what it's there for.
ben
Jul 19 '05 #3

P: n/a
Ben Payne wrote:
I think the most concise, and foolproof way to do this is just:

while(!infile.getline(temp1, max).eof());

this is valid since getline returns a reference to the stream.
the only downside is addition of a function call, but that's
what it's there for.


ARGH! THIS WILL NOT WORK! (Sorry for the shouting, but...)

Note that any given getline() call can successfully read data from the
input stream into 'test1' and, in the process of doing so, detect the
end-of-file condition (and consequently set the stream's eofbit state
flag). IOW, a single getline() call can both read data into 'test1'
*AND* set the stream's eofbit state flag. So your while(!eof) loop
introduces an "off by one" error for this particular case -- i.e., the
program reads some data from infile into test1, it detects/reports the
EOF condition, and the while() loop exits. Notice that the last bit of
file data in 'test1' IS NOT PROCESSED BY THE PROGRAM -- i.e., the data
in test1 is not processed by the code in the body of the while() loop --
because the EOF condition caused the program to break out of the while()
loop too soon! Whoops...

FWIW, this is one of two different "off by one" logic errors that *will
occur* when you write a loop construct like this,

while ( ! end-of-file on an input stream ) ...

A "more better" loop test would be this:

while ( data is successfully read from infile into test1 ) {
process the data in test1;
}

e.g.,

while ( infile.getline(test1,max).gcount() ) ...

[n.b. The gcount() method returns the number of characters extracted
from an input stream object by the last unformatted input member
function(*) called on the object.

(*) e.g., the get() and getline() member functions perform unformatted input
]
FWIW2, there is yet another "gotcha" here. Note that if the getline()
call completely fills the buffer 'test1' without also reading in the
delimiter character (i.e., the buffer 'test1' is too small to hold the
entire line of input), then getline() will assert the input stream's
'failbit' flag to signal this "buffer full" condition. So the program
must also check for, and respond to, this failbit condition -- e.g.,

while ( infile.getline(test1,max).gcount() ) {
// Clear the stream's 'failbit' state flag
infile.clear( infile.rdstate() & ~ios::failbit );
...
}

--
Jim

To reply by email, remove "link" and change "now.here" to "yahoo"
jfischer_link5809{at}now.here.com
Jul 19 '05 #4

P: n/a


Ben Payne wrote:


I think the most concise, and foolproof way to do this is just:

while(!infile.getline(temp1, max).eof());

this is valid since getline returns a reference to the stream.
the only downside is addition of a function call, but that's
what it's there for.


In addition what Jim alredy had to say.

.... it is foolproof until you try to read from a file
from a floppy disk which has a demaged sector in the middle
of your file.
The getline() will fail, but not because of eof
--
Karl Heinz Buchegger
kb******@gascad.at
Jul 19 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.