Re: istream read failure: integral values as bool

Discussion in 'C++' started by Abhishek Padmanabh, Mar 21, 2011.

  1. ..... including comp.lang.c++

    ---------- Forwarded message ----------


    Consider the below code that I came across recently:

    #include <iostream>
    int main ()
    {
      bool a=false;
      std::cout << "insert 0 or 1:";
      std::cin >> a;
      if (a==true)
      {
        std::cout << "a is true";
      }
      else
      {
        std::cout << "a is false";
      }

    }

    If you run the above code and provide input as say, 8, the code still
    returns back saying a is false. I get this behavior with Visual Studio
    2008. I would have thought that the integral value should get
    implicitly converted to a boolean. In fact, when I debugged the code
    in VC++, I do see that it is able to get the value of the user input
    (i.e. 8) but then there is a certain check which then fails and
    results in setting of the failbit of the stream. If I check the status
    of the cin stream post that read, I see the failbit set which means
    the read had failed.

    relevant bit of VC++ code (file: xlocnum, function: do_get)
    Code:
                            {       // get zero or nonzero integer
                            char _Ac[_MAX_INT_DIG], *_Ep;
                            int _Errno = 0;
                            const unsigned long _Ulo = ::_Stoulx(_Ac,
    &_Ep,
                                    _Getifld(_Ac, _First, _Last,
    _Iosbase.flags(),
                                           _Iosbase.getloc()), &_Errno);
                            if (_Ep != _Ac && _Errno == 0 && _Ulo <= 1)
                                    _Ans = _Ulo;
                            }

    The check _Ulo <= 1 is what rejects it. _Ulo is an unsigned long which
    does get successfully evaluated to 8 (the input). So, it is basically
    only allowing any other inputs than 0 and 1 via the stream. Could this
    be a bug in VC++? I am not sure but I would have thought that it would
    have considered any non-zero value as true. Because, if I just simply
    set the value of boolean as 8 instead of reading from the stream, the
    automatic conversion rules kick in and the code works as expected.

    Any views on this as to what the standard says because of which the
    above is considered a failure? Thanks for your help.
    Abhishek Padmanabh, Mar 21, 2011
    #1
    1. Advertising

  2. Abhishek Padmanabh

    Bo Persson Guest

    Abhishek Padmanabh wrote:
    > .... including comp.lang.c++
    >
    > ---------- Forwarded message ----------
    >
    >
    > Consider the below code that I came across recently:
    >
    > #include <iostream>
    > int main ()
    > {
    > bool a=false;
    > std::cout << "insert 0 or 1:";
    > std::cin >> a;
    > if (a==true)
    > {
    > std::cout << "a is true";
    > }
    > else
    > {
    > std::cout << "a is false";
    > }
    >
    > }
    >
    > If you run the above code and provide input as say, 8, the code
    > still returns back saying a is false. I get this behavior with
    > Visual Studio 2008. I would have thought that the integral value
    > should get implicitly converted to a boolean. In fact, when I
    > debugged the code in VC++, I do see that it is able to get the
    > value of the user input (i.e. 8) but then there is a certain check
    > which then fails and results in setting of the failbit of the
    > stream. If I check the status of the cin stream post that read, I
    > see the failbit set which means the read had failed.
    >
    > relevant bit of VC++ code (file: xlocnum, function: do_get)
    > Code:
    > { // get zero or nonzero integer
    > char _Ac[_MAX_INT_DIG], *_Ep;
    > int _Errno = 0;
    > const unsigned long _Ulo = ::_Stoulx(_Ac,
    > &_Ep,
    > _Getifld(_Ac, _First, _Last,
    > _Iosbase.flags(),
    > _Iosbase.getloc()), &_Errno);
    > if (_Ep != _Ac && _Errno == 0 && _Ulo <= 1)
    > _Ans = _Ulo;
    > }
    >
    > The check _Ulo <= 1 is what rejects it. _Ulo is an unsigned long
    > which does get successfully evaluated to 8 (the input). So, it is
    > basically only allowing any other inputs than 0 and 1 via the
    > stream. Could this be a bug in VC++? I am not sure but I would have
    > thought that it would have considered any non-zero value as true.
    > Because, if I just simply set the value of boolean as 8 instead of
    > reading from the stream, the automatic conversion rules kick in and
    > the code works as expected.
    >
    > Any views on this as to what the standard says because of which the
    > above is considered a failure? Thanks for your help.


    No, it is not a bug. If the value read is invalid for the type, the
    variable is left unchanged.

    The stream would then have its fail() function return true.



    Bo Persson
    Bo Persson, Mar 21, 2011
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Steve
    Replies:
    6
    Views:
    3,679
    Steve
    May 13, 2004
  2. Nomak
    Replies:
    4
    Views:
    600
    Ali Cehreli
    Aug 16, 2004
  3. Replies:
    3
    Views:
    903
  4. Daniel Molina Wegener

    printf, padding integral double values

    Daniel Molina Wegener, Feb 14, 2005, in forum: C Programming
    Replies:
    2
    Views:
    647
    Martin Ambuhl
    Feb 14, 2005
  5. xmllmx
    Replies:
    5
    Views:
    588
    Jorgen Grahn
    Jun 15, 2010
Loading...

Share This Page