c++ - 使用 std::istream::operator>> 处理无符号类型,我如何区分下溢提取失败?

标签 c++ io iostream

我想使用 std::istream::operator>> 将数据提取为无符号类型(在模板内,因此它可以是 ushort、uint 等)。具体来说,我使用 std::stringstream 来解析通过 std::getline() 调用从文件中提取的 std::string 行。

因为我正在从文件中读取数据,所以这些提取可能会因不同的原因而失败:下溢、溢出和“提取不当”。这种情况由 STL 处理:

If extraction fails, zero is written to value and failbit is set. If extraction results in the value too large or too small to fit in value, std::numeric_limits::max() or std::numeric_limits::min() is written and failbit flag is set.

source: cppreference

问题:对于无符号类型,std::numeric_limits::min() 等于 0,因此无法知道我正在读取的内容是否不是整数(在这种情况下我正在中止程序)或如果它只是下溢(在这种情况下,我只是限制值并发出警告)。

如何在不使用我正在使用的无符号类型的更大和/或有符号等价物的情况下解决这个问题?

最佳答案

无符号类型不会下溢。如果您通过输入负数表示“下溢”,则标准流不会将其视为错误。负数环绕到无符号类型中,并且 failbit 未设置。

因此,如果您看到存储了 0 并且设置了 failbit,您可以断言这是提取失败。要检测负数错误,您必须做一些额外的工作。例如,您可以先读取一个(足够大的)有符号整数类型的值来检测它是否为负数。

关于c++ - 使用 std::istream::operator>> 处理无符号类型,我如何区分下溢提取失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57852441/

相关文章:

c++ - 使用 MPI 集体通信发送结构

python - 为什么我不能将 sys.stdin 中的所有数据写入 Windows 中的文件?

c++ - 我应该在哪里使用 iostream 类?

c++ - "has << operator"类型的参数

c++ - 在结构中调用 lambda 函数

c++ - 生成错误E0530初始化,预期聚合对象使用 '{..}'

c++ - 与 std::function 的比较运算符

java - 如何关闭 IO?

ruby - 如何从 ruby​​ 中的 IO 对象获取文件名

c++ - UTF-8 兼容的 IOstreams