gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:24 24 4
gpt4 key购买 nike

我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com