簡體   English   中英

使用std :: istream :: operator >>處理無符號類型時,如何區分從下溢中提取失敗?

[英]With std::istream::operator>> working on unsigned types, how do I tell apart a failed extraction from an underflow?

我想使用std :: istream :: operator >>將數據提取到無符號類型(在模板中,因此它可以是ushort,uint等)。 具體來說,我正在使用std :: stringstream來解析使用std :: getline()調用從文件中提取的std :: string行。

由於我正在從一個文件中讀取,這些提取可能由於不同的原因而失敗:下溢,溢出和“錯誤提取”。 此類案件由STL處理:

如果提取失敗,則將零寫入值並設置failbit。 如果提取導致值太大或太小而不適合值,則寫入std :: numeric_limits :: max()或std :: numeric_limits :: min()並設置failbit標志。

來源:cppreference

問題:對於無符號類型,std :: numeric_limits :: min()等於0,因此無法知道我是否正在讀取不是整數的東西(在這種情況下我正在中止程序)或者它是否只是下溢(在這種情況下,我只是鉗制值並發出警告)。

如何在不使用我正在使用的無符號類型的更大和/或有符號等價物的情況下解決這個問題?

無符號類型不會下溢。 如果您通過輸入負數表示“下溢”,則標准流不會將其視為錯誤。 負數被包含在無符號類型中,並且未設置failbit

因此,如果您看到0存儲並且設置了failbit則可以斷言它是一個提取失敗。 要檢測負數錯誤,您必須做一些額外的工作。 例如,您可以先讀取(足夠大的)有符號整數類型中的值,以檢測它是否為負數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM