News:

This week IPhone 15 Pro winner is karn
You can be too a winner! Become the top poster of the week and win valuable prizes.  More details are You are not allowed to view links. Register or Login 

Main Menu

C++ Tips: IO - loop testing for IO

Started by ben2ong2, October 06, 2006, 11:23:47 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ben2ong2

(Newsgroups: comp.lang.c++.moderated, 1 Jun 97)


BELLINGHAM: Alan Bellingham
>
>
> What's wrong with:
>
>    for(;;)
>    {
>       in >> object ;
>       if ( in.eof())
>          break ;
>       out << object;
>    }


CLAMAGE: Steve Clamage <stephen.clamage@Eng.Sun.COM>

If eof() is true, it doesn't mean the previous input failed.
If eof() is false, it doesn't mean the previous input succeeded.

Your example illustrates why you normally do not want to use eof()
for loop control. If input failed due to incorrect format, the
loop outputs that last successful input forever, never reading more,
and never terminating. But if eof was set as as result of reading
the last value, you don't output the last value.

The only safe assumption about eof() is when it returns true, it
means no more input data is available.

You could rewrite the above loop like this

        for(;;) {       // repeat input until failure
                in >> object;
                if( ! in )
                        break; // previous input failed
                out << object;
        }
        // find out what caused the failure
        if( in.eof() )
                ... we processed all the input
        else
                ... last input failed but not because of eof

I would probably write the loop like this

        do {
                in >> object;
                if( in )
                        out << object;
        } while( in );

I find this style of coding easier to understand and maintain --
it says exactly what it means, and its obvious where to put
additional code that depends on whether the input succeeded.
(Yes, it repeats a test, but I doubt you could measure the
difference in performance since the test is really cheap, and
I/O is really expensive.)
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login