我想使用std :: istream :: operator >>将数据提取为无符号类型(位于模板内,因此可以是ushort,uint等)。具体来说,我正在使用std :: stringstream解析通过std :: getline()调用从文件中提取的std :: string行。
由于我正在从文件中读取数据,因此这些提取可能由于不同的原因而失败:下溢,溢出和“错误提取”。此类情况由STL处理:
如果提取失败,则将零写入值并设置故障位。如果提取导致值太大或太小而无法容纳该值,则将写入std :: numeric_limits :: max()或std :: numeric_limits :: min()并设置故障位标志。
问题:对于无符号类型,std :: numeric_limits :: min()等于0,因此无法知道我是否正在读取不是整数的内容(在这种情况下,我正在中止程序)或只是下溢(在这种情况下,我只是钳制值并发出警告)。
如何解决此问题而不使用与我合作的无符号类型的更大和/或带符号的等效项?
无符号类型不会下溢。如果您通过输入负数来表示“下溢”,则标准流不会将其视为错误。负数被包装成无符号类型,并且failbit不被设置。
因此,如果您看到 0 已存储并failbit已设置,则可以断言这是提取失败。要检测负数错误,您必须做一些额外的工作。例如,您可以首先读取(足够大的)有符号整数类型的值来检测它是否为负数。
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |