while statement

M

muser

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.
 
T

Thomas Matthews

muser said:
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
 
B

Ben Payne

Thomas Matthews said:
muser said:
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
 
J

Jim Fischer

Ben said:
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 );
...
}
 
K

Karl Heinz Buchegger

Ben said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top