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

Reply via email to