2017-01-18 143 views
1
#include <fstream> 

int main() 
{ 
    std::ifstream fin{ "" }; 
    size_t n = fin.tellg(); // ok 
} 

代碼編譯成功。然而,根據cppreference,我發現fin.tellg()是一種std::fpos,它沒有定義隱式轉換爲size_t的能力。可以[std :: streampos]隱式轉換爲[size_t]嗎?

任何解釋?

+2

'std :: streampos'是一個整數類型,它* *可能與您的系統上的'size_t'兼容。只是因爲沒有保證,並不意味着它永遠不會起作用。 –

+1

如果文件非常大,您應該特別小心這種轉換。 –

+1

從理論上講,'std :: fpos'是64位,而'size_t'是32位。 – rustyx

回答

2

你說得對,因爲它返回std::fpos。現在,讓我們來看看它是如何定義的:

template<class _Statetype> 
    class fpos {<...>} 

fpos也確實有一個轉換操作符轉換成streamoff類型,是「流偏移」類型:

__CLR_OR_THIS_CALL operator streamoff() const 
    { // return offset 
    return ((streamoff)(_Myoff + _FPOSOFF(_Fpos))); 
    } 

在我的機器streamoff恰好是定義爲typedef _Longlong streamoff;,我相信它在你的機器上類似。這就是爲什麼它可以轉換爲type_t,但是沒有什麼可以防止它大於type_t,所以要小心。

1

您的平臺上的「確定」。不一定在所有平臺上都可以。無論在實踐中,這意味着很大程度上取決於環境。例如,在32位系統上,該文件可能爲4 GB或更大,因此不適合32位size_t,其中std::fpos是64位值,並且保留文件的大小。

如果使用n來確定文件的長度或其他一些問題,如果您錯誤判斷總大小 - 覆蓋舊數據,或者如果您加載文件然後基於此保存文件,則可能會發生嚴重問題會丟失部分或全部數據。

+1

只是一個小問題:加載和保存文件的問題更加複雜 - 而且不能通過其他類型來解決。原因是如果文件大小不適合size_t,那麼文件內容不太適合內存。 –

相關問題