std::fstream のファイルのファイル サイズを取得するには多くの質問がありますが、それらはすべてファイル サイズをバイト単位で返し、ファイルが別のストリームで開かれている場合はエラーが発生しやすくなります。
バイトではなくコードポイントでファイルサイズを知りたいです。
これで、バイト単位の長さのみが返されstd::fstream::seekg(0,std::ios::end)
ます。std::fstream::tellg()
これは、ファイル内の UTF-16/32 文字の数を教えてくれません。その結果sizeof(wchar_t)
をあなたの言うことを聞いて割ってください。UTF-8 ファイルでは機能せず、移植可能ではありません。
さて、より技術的な考え方のために、私は独自のクラスを持つimbued
ストリームを持っています。ストリームへの 2 つのポインターを指定すると、長さを計算し、最大出力文字数または出力文字数のいずれかを返すメンバーがあります。ファイルのシークは、基本型ではなくシークすると思っていたでしょう。std::codecvt
std::codecvt
length()
codecvt::intern_type
char
ヘッダーを調べたfstream
ところ、seek infact でcodecvt
. また、VS2010 の私のバージョンでは、codecvt::length()
メンバーについても言及されていません。実際、 を呼び出すたびに、新しい文字列オブジェクトが作成され、 が返さcodecvt::in()
れるたびに 1 文字ずつサイズが増加します。代わりに、メンバーを呼び出して、呼び出しに適切なバッファーを提供しません。in()
partial
codecvt::max_length()
これは私の実装だけですか、それとも他の人も同じことを期待できますか? std::fstream
ロケールをフルに活用するために VS2012 用に書き直されましたか?
基本的に、テキスト ファイルを使用するたびに独自のファイル ハンドラーを作成する必要があることにうんざりしています。ファイルBOMfstream
が存在する場合は最初にそれを読み取り、正しいcodecvt
. char
次に、それらの文字を、wchar_t
またはコードが要求するものに変換します。また、エンコーディングの事前知識がわかっている場合は、構築時に alocale
を指定できるようにコーディングしたいと考えています。
内部バッファで直接作業した方がよいでしょうか? fstream クラスを書き直すのに影響しますか、それとも私が知らないいくつかのトリックがありますか?