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

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

コードはokです。しかし、cppreferenceによれば、は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が返ってくることは間違いありません。今度は、それが定義されています方法を見てみましょう:streamoffがあることを起こる私のマシン上で

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

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

fposも「ストリームオフセット」タイプであるstreamoff型に変換するための変換演算子を持っていますtypedef _Longlong streamoff;と定義されていると、私はそれがあなたのマシン上で似たものだと信じています。このため、type_tに変換することができますが、type_tより大きくなることはありませんので、注意してください。

1

プラットフォーム上で「OK」必ずしもすべてのプラットフォームでOKであるとは限りません。実際にそれが意味するかどうかは、状況によって異なります。たとえば、32ビットシステムでは、ファイルが4GB以上で、32ビットのsize_tに収まらない場合があります。std::fposは64ビット値で、ファイルのサイズを保持します。

ファイルの長さなどを判断するためにnを使用すると、古いデータを上書きするか、ファイルをロードしてそれに基づいて保存すると、重大な問題が発生することがあります。データの一部またはすべてを失う。

+1

ほんのちょっとした注意:ファイルを読み込んで保存する際の問題はもっと複雑で、別のタイプでは本当に解決できません。その理由は、file-sizeがsize_tに収まらない場合、ファイルの内容がメモリに収まらない可能性があるからです。 –

関連する問題