Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > while statement

Reply
Thread Tools

while statement

 
 
muser
Guest
Posts: n/a
 
      06-23-2003
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.
 
Reply With Quote
 
 
 
 
Thomas Matthews
Guest
Posts: n/a
 
      06-23-2003
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

 
Reply With Quote
 
 
 
 
Ben Payne
Guest
Posts: n/a
 
      06-27-2003
"John Harrison" <(E-Mail Removed)> wrote in
news:bd8nfb$qeadq$(E-Mail Removed):

>
> "Thomas Matthews" <(E-Mail Removed)> wrote in message
> news:(E-Mail Removed)...
>> 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
 
Reply With Quote
 
Jim Fischer
Guest
Posts: n/a
 
      06-27-2003
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


 
Reply With Quote
 
Karl Heinz Buchegger
Guest
Posts: n/a
 
      06-27-2003


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
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
if statement that, when false, skips first statement in its block, executes second? Jay McGavren Java 11 01-16-2006 05:49 PM
How do I do a conditional statement in a constant statement? tkvhdl@gmail.com VHDL 3 12-16-2005 06:13 PM
Which of switch statement and if-else statement takes less time to execute? swaroophr@gmail.com C Programming 21 08-02-2005 09:24 AM
exec "statement" VS. exec "statement in globals(), locals() Ted Python 1 07-22-2004 08:51 AM
exec "statement" VS. exec "statement" in globals(), locals() tedsuzman Python 2 07-21-2004 08:41 PM



Advertisments