...
When calling num_get<>::get()
, information about conversion errors is returned to the caller through the ios_base::iostate&
argument. The C++ Standard, section [facet.num.get.virtuals], paragraph 3 states, in part 3 [ISO/IEC 14882-2014], in part, states the following:
If the conversion function fails to convert the entire field, or if the field represents a value outside the range of representable values,
ios_base::failbit
is assigned toerr
.
Always explicitly check the error state of a conversion from string to a numeric value (or handle the related exception, if applicable) instead of assuming the conversion results in a valid value. This rule is in addition to ERR34-C. Detect errors when converting a string to a number, which bans the use of conversion functions that do not perform conversion validation such as std::atoi()
and std::scanf()
from the C Standard Library.
Noncompliant Code Example
...
In this compliant solution, each converted value read from the standard input stream is tested for validity before reading the next value in the sequence, allowing error recovery on a per-value basis. It checks std::istream::fail()
to see if the failure bit was set due to a conversion failure or whether the bad bit was set due to a loss of integrity with the stream object. If a failure condition is encountered, it is cleared on the input stream and then characters are read and discarded until a ' '
(space) character occurs. Note that the The error handling in this case only works if a space character is what delimits the two numeric values to be converted.
...