[英]C++ tellg() return type
我有一個大的二進制文件,我正在閱讀,我想比較當前位置與unsigned long long int。 但是,基於C ++文檔,我不清楚是否:
任何答案或建議將不勝感激。
問 :tellg()的返回類型是什么?
A istream::tellg()
的返回類型是streampos
。 看看std :: istream :: tellg 。
問:如何將tellg()與unsigned long long int進行比較?
A tellg()
的返回值是一個整數類型。 所以你可以使用通常的運算符來比較兩個int
。 但是,您不應該這樣做以從中得出任何結論。 標准聲稱支持的唯一操作是:
可以將這種類型的兩個對象與運算符==和!=進行比較。 它們也可以減去,產生類型streamoff的值。
看看std :: streampos 。
問 :tellg()的返回類型是否有可能小於unsigned long long int的最大值(來自numeric_limits)?
A該標准不作任何聲明支持或反駁它。 在一個平台上可能是真的,而另一個平台則是假的。
比較streampos
,支持和不支持的比較操作的示例
ifstream if(myinputfile);
// Do stuff.
streampos pos1 = if.tellg();
// Do more stuff
streampos pos2 = if.tellg();
if ( pos1 == pos2 ) // Supported
{
// Do some more stuff.
}
if ( pos1 != pos2 ) // Supported
{
// Do some more stuff.
}
if ( pos1 != pos2 ) // Supported
{
// Do some more stuff.
}
if ( pos1 == 0 ) // supported
{
// Do some more stuff.
}
if ( pos1 != 0) // supported
{
// Do some more stuff.
}
if ( pos1 <= pos2 ) // NOT supported
{
// Do some more stuff.
}
int k = 1200;
if ( k == pos1 ) // NOT supported
{
}
R Sahu在回答問題方面做得很好,但是當將.tellg()
的結果存儲在int
時我得到了溢出,並做了一些額外的調查。
std::streamoff
(讀作“stream offset”)作為整數類型來存儲tellg()
的結果。 pos_type tellg();
其中pos_type
由Traits
模板參數定義,而pos_type
模板參數又是實現定義的。 對於std :: ifstream,Traits是char類型的std :: char_traits ,它導致std :: fpos 。 我們在這里看到:
fpos類型的每個對象都保存流中的字節位置(通常作為std :: streamoff類型的私有成員 )和當前的shift狀態,State類型的值(通常是std :: mbstate_t)。
(由我完成的粗體)
因此,為了避免溢出,將tellg()
的結果tellg()
為std::streamoff
tellg()
的類型應該是安全的。 此外,檢查std :: streamoff它說
類型std :: streamoff是一個足夠大小的有符號整數類型,表示操作系統支持的最大可能文件大小。 通常,這是一個很長的typedef。
由於確切的類型是由您的系統定義的,因此運行快速測試可能是個好主意。 這是我機器上的結果:
std::cout << "long long:" std::is_same<std::ifstream::off_type, long long>::value << std::endl;
std::cout << "long:" std::is_same<std::ifstream::off_type, long>::value << std::endl;
// Outputs
// long long:0
// long:1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.