簡體   English   中英

C ++ tellg()返回類型

[英]C++ tellg() return type

我有一個大的二進制文件,我正在閱讀,我想比較當前位置與unsigned long long int。 但是,基於C ++文檔,我不清楚是否:

  1. 什么是tellg()的返回類型
  2. 如何將tellg()與unsigned long long int進行比較?
  3. 是否有可能tellg()的返回類型具有小於unsigned long long int的最大值(來自numeric_limits)?

任何答案或建議將不勝感激。

: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時我得到了溢出,並做了一些額外的調查。

TL; DR:使用std::streamoff (讀作“stream offset”)作為整數類型來存儲tellg()的結果。

從瀏覽std :: basic_ifstream

pos_type tellg();

其中pos_typeTraits模板參數定義,而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.

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