#include <fstream>
int main()
{
std::ifstream fin{ "" };
size_t n = fin.tellg(); // ok
}
コードはokです。しかし、cppreferenceによれば、はstd::fpos
のタイプであり、暗黙的にsize_t
に変換する能力を定義していません。[std :: streampos]を暗黙的に[size_t]に変換できますか?
説明はありますか?
#include <fstream>
int main()
{
std::ifstream fin{ "" };
size_t n = fin.tellg(); // ok
}
コードはokです。しかし、cppreferenceによれば、はstd::fpos
のタイプであり、暗黙的にsize_t
に変換する能力を定義していません。[std :: streampos]を暗黙的に[size_t]に変換できますか?
説明はありますか?
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
より大きくなることはありませんので、注意してください。
プラットフォーム上で「OK」必ずしもすべてのプラットフォームでOKであるとは限りません。実際にそれが意味するかどうかは、状況によって異なります。たとえば、32ビットシステムでは、ファイルが4GB以上で、32ビットのsize_t
に収まらない場合があります。std::fpos
は64ビット値で、ファイルのサイズを保持します。
ファイルの長さなどを判断するためにn
を使用すると、古いデータを上書きするか、ファイルをロードしてそれに基づいて保存すると、重大な問題が発生することがあります。データの一部またはすべてを失う。
ほんのちょっとした注意:ファイルを読み込んで保存する際の問題はもっと複雑で、別のタイプでは本当に解決できません。その理由は、file-sizeがsize_tに収まらない場合、ファイルの内容がメモリに収まらない可能性があるからです。 –
'std :: streampos'はシステム上で' size_t'と互換性があるかもしれない整数型です。保証がないという理由だけで、決して*働かないという意味ではありません。 –
ファイルが非常に大きい場合は、そのような変換に特に注意する必要があります。 –
理論的には 'std :: fpos'は64ビットで、' size_t'は32ビットです。 – rustyx