Ryan's District Boards

Computer, programming, and webmaster help , support , tips and tricks => Tutorials Zone! => Internet webmaster computer programming technology tips and tricks => C++ / C / C# ....Tutorials => Topic started by: ben2ong2 on October 06, 2006, 11:23:47 PM

Title: C++ Tips: IO - loop testing for IO
Post by: ben2ong2 on October 06, 2006, 11:23:47 PM
(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.)