by the way, this was a bug report, but a support request. but really this "bug
report" has just morphed into an ECO for a serious reason.
please note that I am not doing getline. totally different operation. I will
show you why.
I would like to submit an Engineering Change Order against iostream and
ifstream. .good() includes .eof() and is better. I tried modifying the code
for .eof and it still doesn't work. checking for .eof() after cin'ing a number
doesn't work.
the problem seems to be the whitespace (space, cr, lf) AFTER the 1 in the text
file which is in SO MANY windows systems when people simply do
echo 1 > somefile.txt
in windows systems.
no amount of checking for .eof() or .good() will remedy that, because EOF
hasn't come yet! there's still whitespace to chew up. By behavior I believe
istream::operator>>() eats whitespace and THEN gets the value. this is the
way it's acting. but it sure doesn't act nice when it's the last value! you
always get the same one twice unless you make your own input system.
because nothing short of a function that chews up that trailing whitespace is
going to fix that and get you to that EOF so you can detect .eof() or .good()
which includes .eof().
in fact, such a method OUGHT to be part of istream and ifstream and part of
everybody's input reading method before checking for .eof() or .good()
for example, usage of the method I am proposing might look something like this
//this assumes the existence of std::istream.eatws() and std::ifstream.eatws()
#include <fstream>
#include <iostream>
int main(int argc, char * argv[], char * envp[]) {
int n;
std::ifstream filein;
filein.open("somefile.txt", std::ifstream::in);
if (!filein.good() && !filein.eof()) {
filein.close();
std::cerr << "ERROR: unable to open file \"somefile.txt\"" << std::endl;
return 1;
}
do {
filein >> n;
filein.eatws();
std::cout << n << std::endl;
} while (!filein.eof());
filein.close();
return 0;
}
manually eating whitespace after inputting a value allows you to get the file
pointer right to the next value OR another value directly.
...instead of getting a pointer to the next whitespace before EOF.
so I am proposing an official change in iostream and ifstream.
I have not some up with my own code for such a method. but I might be able to.
this problem is not specific to gcc. it is in borland c++ 5.5.1 as well.
operator>>() doesn't figure out until it has eaten the whitespace and is about
to try to consume a value (it thinks) that it has hit EOF. but for some
interesting reason I guess because it doesn't know what best to do when it hits
EOF at that point, it simply spits out the last value it had and throws up its
hands in disgust, since it can't return EOF or give any indication of failure -
it's a 1-trick pony.
...and it doesn't throw.
>________________________________
>From: Ruben Van Boxem <[email protected]>
>To: [email protected]
>Sent: Wednesday, April 25, 2012 2:25 PM
>Subject: Re: [Mingw-w64-public] ifstream reads once too many times?
>
>
>Op 25 apr. 2012 23:07 schreef "Jim Michaels" <[email protected]> het volgende:
>>
>>
>> #include <fstream>
>> #include <iostream>
>> int main(int argc, char * argv[], char * envp[]) {
>> int n;
>> std::ifstream filein;
>> filein.open("somefile.txt", std::ifstream::in);
>> if (!filein.good()) {
>> filein.close();
>> std::cerr << "ERROR: unable to open file \"somefile.txt\"" <<
>> std::endl;
>> return 1;
>> }
>> filein >> n;
>> if (filein.good()) {
>> std::cout << n << std::endl;
>> }
>> while (filein.good()) {
>> std::cout << n << std::endl;
>> filein >> n;
>> }
>> filein.close();
>> return 0;
>> }
>>
>> somefile.txt contains a 1
>> but mingw-w64 outputs
>> 1
>> 1
>> this happens with 20111127. it happens with
>>
>> I have tried rearranging this to
>> #include <fstream>
>> #include <iostream>
>> int main(int argc, char * argv[], char * envp[]) {
>> int n;
>> std::ifstream filein;
>> filein.open("somefile.txt", std::ifstream::in);
>> if (!filein.good()) {
>> filein.close();
>> std::cerr << "ERROR: unable to open file \"somefile.txt\"" <<
>> std::endl;
>> return 1;
>> }
>> if (filein.good()) {
>> filein >> n;
>> std::cout << n << std::endl;
>> }
>> while (filein.good()) {
>> filein >> n;
>> std::cout << n << std::endl;
>> }
>> filein.close();
>> return 0;
>> }
>>
>> but it makes no difference. same result. this also happens with mingw also.
>http://lmgtfy.com/?q=c%2B%2B+getline+one+line+too+many
>This is not the first time I'm telling you this: this is not a general
>programming question mailing list.
>This has to be the most easy thing to Google...
>Ruben
>>
>>
>>
>> -------------
>> Jim Michaels
>> [email protected]
>> [email protected]
>> http://JimsComputerRepairandWebDesign.com
>> http://JesusnJim.com (my personal site, has software)
>> ---
>> Computer memory measurements, SSD measurements, microsoft disk size
>> measurements (note: they will say GB or MB or KB or TB when it is not!):
>> [KiB] [MiB] [GiB] [TiB]
>> [2^10B=1,024B=1KiB]
>> [2^20B=1,048,576B=1MiB]
>> [2^30B=1,073,741,824B=1GiB]
>> [2^40B=1,099,511,627,776B=1TiB]
>> hard disk industry disk size measurements:
>> [KB] [MB] [GB] [TB]
>> [10^3B=1,000B=1KB]
>> [10^6B=1,000,000B=1MB]
>> [10^9B=1,000,000,000B=1GB]
>> [10^12B=1,000,000,000,000B=1TB]
>>
>>
>>
>> ------------------------------------------------------------------------------
>> Live Security Virtual Conference
>> Exclusive live event will cover all the ways today's security and
>> threat landscape has changed and how IT managers can respond. Discussions
>> will include endpoint security, mobile security and the latest in malware
>> threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
>> _______________________________________________
>> Mingw-w64-public mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>>
>
>------------------------------------------------------------------------------
>Live Security Virtual Conference
>Exclusive live event will cover all the ways today's security and
>threat landscape has changed and how IT managers can respond. Discussions
>will include endpoint security, mobile security and the latest in malware
>threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
>_______________________________________________
>Mingw-w64-public mailing list
>[email protected]
>https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
>
>
>------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public