is this a bug of g++?


 
Thread Tools Search this Thread
Top Forums Programming is this a bug of g++?
# 1  
Old 03-11-2011
is this a bug of g++?

Hello,
Im using the g++(g++ Ubuntu/Linaro 4.4.4-14ubuntu5 4.4.5) and im trying to compile a small snippet code and got into an endless loop.I recompiled that in VS2010 under Windows 7 and the answer is as expected.so i wonder is this a bug of g++?here is my code.
Code:
#include<iostream>

using namespace std;

int main()
{
	int val;

	while(cin>>val,!(cin.eof())){
		if(cin.fail()){
			cerr<<"bad data,try again"<<endl;;
			cin.clear();
			continue;
		}else if(cin.good()){
			cerr<<"you entered :"<<val<<endl;
			break;
		}
}
}

---------- Post updated at 04:24 AM ---------- Previous update was at 04:07 AM ----------

Actually,the code::blocks with Mingw runs the code below OK while my g++ gets a endless loop.
Code:
#include <iostream>
using namespace std;

int main()
{
	int val;

	while(cin>>val,!cin.eof()){
		if(cin.fail()){
			cerr<<"failed,try again"<<endl;
			cin.clear();
			cin.sync();      //ADD THIS
		}else if(cin.good()){
			cout<<"you entered: "<<val<<endl;
			break;
		}
	}
}


Last edited by homeboy; 03-11-2011 at 06:11 AM..
# 2  
Old 03-11-2011
My understanding is you need to flush the "bad" data.
cin.clear() doesn't clear the buffer, it clears error conditions.
Code:
#include<iostream>

using namespace std;

int main()
{
    int val;
    string bad;

    while(cin>>val,!(cin.eof()))
    {
        if(cin.fail())
        {
            cerr<<"bad data,try again"<<endl;;
            cin.clear();
            cin>>bad;
            continue;
        }
        else if(cin.good())
        {
            cerr<<"you entered :"<<val<<endl;
            break;
        }
    }
}

# 3  
Old 03-11-2011
yes,i think your solution is same as adding cin.sync().
# 4  
Old 03-11-2011
It isn't the same, at least with my tests here. cin.sync() doesn't flush the buffer so I experience the same issue with it. Reading cin in a string breaks the endless loop.
This User Gave Thanks to jlliagre For This Post:
# 5  
Old 03-11-2011
Quote:
Originally Posted by jlliagre
It isn't the same, at least with my tests here. cin.sync() doesn't flush the buffer so I experience the same issue with it. Reading cin in a string breaks the endless loop.
yeah,sometimes it won't work by adding sync(),such as with my platform and my compiler version,as i said above,mingw works fine.Your solution is a good way to handle this problem.But i'm wondering is there a portable way to eliminate such a problem.Because we may do something like:
cin>>a_int>>a_string>>a_double;
what if the error occurs when we get the first value(enter a string when needs a integer)?we have to use getline() to flush the invalid data.
# 6  
Old 03-11-2011
It sounds like the same or similar problem as scanf() in C: It throws up on bad data but doesn't actually discard the bad data.

In C the usual approach is to read strings line-by-line with fgets or getline (fgets preferred because there's some very broken getline implementations out there), then feed the line into sscanf. Whether sscanf succeeds or not, the data is out of the input stream and out of your way.

C++ doesn't have special string-only functions, it uses stringstream to make a string act like ss>>var>>var; instead. Whether reading your vars from the string succeeds or not, the data is out of cin and can't come back to haunt you.

Here's an example.
Login or Register to Ask a Question

Previous Thread | Next Thread

8 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

A $(( expression )) bug?

This is for the big guns... I have been modifying AudioScope.sh to bring it inline with more current practices. I hit a bug which IS not present in the original code but was after modification. Shell check first:- #!/bin/sh txt="1234567890" echo "$(( $txt ))" echo "$(( ${#txt} - 1 ))" echo... (17 Replies)
Discussion started by: wisecracker
17 Replies

2. Shell Programming and Scripting

How to fix this bug?

Hi gurus, I have script as below: #!/bin/ksh while : do cat /dev/null > srcfile exit_time=`TZ=GMT-20 date +%Y%m%d1950` cur_time=`date +%Y%m%d%H%M` flag=1 if ; then ... (7 Replies)
Discussion started by: ken6503
7 Replies

3. UNIX for Dummies Questions & Answers

where's the bug?

#!/bin/bash if then #echo "infinite loop" exit 0 fi when I run this file I get the following error: ./test_infinite_loop: line 5: syntax error near unexpected token `fi' ./test_infinite_loop: line 5: `fi' :confused: (4 Replies)
Discussion started by: jon80
4 Replies

4. AIX

bug in 43 ???

xxxxserver# lsattr -El inet0 | grep 255.240.0.0,32.224.0.0,32.78.120.254 | grep '.40' route net,-hopcount,1,-netmask,255.240.0.0,32.224.0.0,32.78.120.254 How this is possible? (1 Reply)
Discussion started by: itik
1 Replies

5. Shell Programming and Scripting

Is it a bug ..?

Hi All, I am using Red Hat Linux on my servers. The problem that I am facing is, sometimes the /opt usage on the server shows used percentage as 100% , when actually it is simply 20%. When I reboot the system, it comes back to 20%.Is this a bug in the system or my settings have gone wrong... (1 Reply)
Discussion started by: nua7
1 Replies

6. UNIX for Advanced & Expert Users

logrotate bug?

I have been mailing myself logs for a while, but just ran into a problem because of a process that cannot HUP its log. (I realize thats why they implemented the "copytruncate" option in the first place) When I use logrotate with "copytruncate" and "compress" there is a problem. The "myScript"... (0 Replies)
Discussion started by: jjinno
0 Replies

7. Post Here to Contact Site Administrators and Moderators

Have I found a bug?

When searching for new posts, I see that my voting in one of the polls counts as a 'new post'. However, while the '<blah> minutes ago' entry updates correctly, the 'by <username>' is the last user to actually post a comment in the poll instead. Result: Poll: vB Guest Book 39... (4 Replies)
Discussion started by: Smiling Dragon
4 Replies

8. Programming

Bug has developed

Guys there is another bug that has developed.........now messaged above 6 bytes are trimmed and echoed back to client.After the first message the echo is not regular.I have put a loop in both client and server to check for closing.Moreover for connection close i also need to put another clause that... (3 Replies)
Discussion started by: arjunjag
3 Replies
Login or Register to Ask a Question