Re: reading words from cin
* Joshua Lehrer:
which is the proper loop to read words from cin:
using namespace std;
while (!cin.eof()) {
std::string s;
cin >> s;
cout << "word:" << s << endl;
}
This loop fails to handle
1. That 'cin >> s' can fail due to other reasons than eof.
2. That 'cin >> s' can fail due to reaching eof before encountering any
non-whitespace character.
or
while (1) {
std::string s;
cin >> s;
if (cin.eof()) break;
cout << "word:" << s << endl;
}
This loop fails to handle
1. That 'cin >> s' can fail due to other reasons than eof.
From my reading of the standard, it is unclear to me if reading the
last word and its end of file both populates the string and sets
(cin.eof()==true), or if eof only gets set when trying to read and
there are no words left ,just the EOF marker.
The eof bit is set when trying to read beyond the end of the file (or
stream). End of file is detected by the read attempt. Thus, end of
file is not magically set when reading the last byte in a file, but when
trying to read a non-existent subsequent byte -- which is necessary to
determine whether a word includes further characters -- so if the last
byte of a file is part of the representation of the last character in
a word, then yes, reading that word must necessarily set the eof bit.
Here's what I'd consider a better loop, off the cuff (not tested! ;-) ):
for( ;; )
{
std::string s;
if( !(std::cin >> s) )
{
break;
}
std::cout << "word: " << s << std::endl;
}
--
A: Because it messes up the order in which people normally read text.
Q: Why is it such a bad thing?
A: Top-posting.
Q: What is the most annoying thing on usenet and in e-mail?
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]