#include <fstream>
int main()
{
std::ifstream fin{ "" };
size_t n = fin.tellg(); // ok
}
代碼編譯成功。然而,根據cppreference,我發現fin.tellg()
是一種std::fpos
,它沒有定義隱式轉換爲size_t
的能力。可以[std :: streampos]隱式轉換爲[size_t]嗎?
任何解釋?
#include <fstream>
int main()
{
std::ifstream fin{ "" };
size_t n = fin.tellg(); // ok
}
代碼編譯成功。然而,根據cppreference,我發現fin.tellg()
是一種std::fpos
,它沒有定義隱式轉換爲size_t
的能力。可以[std :: streampos]隱式轉換爲[size_t]嗎?
任何解釋?
你說得對,因爲它返回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
,所以要小心。
您的平臺上的「確定」。不一定在所有平臺上都可以。無論在實踐中,這意味着很大程度上取決於環境。例如,在32位系統上,該文件可能爲4 GB或更大,因此不適合32位size_t
,其中std::fpos
是64位值,並且保留文件的大小。
如果使用n
來確定文件的長度或其他一些問題,如果您錯誤判斷總大小 - 覆蓋舊數據,或者如果您加載文件然後基於此保存文件,則可能會發生嚴重問題會丟失部分或全部數據。
只是一個小問題:加載和保存文件的問題更加複雜 - 而且不能通過其他類型來解決。原因是如果文件大小不適合size_t,那麼文件內容不太適合內存。 –
'std :: streampos'是一個整數類型,它* *可能與您的系統上的'size_t'兼容。只是因爲沒有保證,並不意味着它永遠不會起作用。 –
如果文件非常大,您應該特別小心這種轉換。 –
從理論上講,'std :: fpos'是64位,而'size_t'是32位。 – rustyx