この質問をより深く検討し、他のコメントと回答(ありがとう)を考慮した後、最も簡単なアプローチは、オフセットが2147483647バイトより大きい場合、2つのシークを行うことです。これにより、オフセットをuint32_t
のままにして、fseek
を使用し続けることができます。位置コードは、このようなことである。
// note: error handling code omitted
uint32_t offset = ... (whatever it is)
if(offset > 2147483647){
fseek(file, 2147483647, SEEK_SET);
fseek(file, (long int)(offset - 2147483647), SEEK_CUR);
} else {
fseek(file, (long int) offset, SEEK_SET);
}
64ビットタイプを使用しての問題点は、コードは、(とりわけ)32ビットアーキテクチャ上で実行されるかもしれないということです。構造fpos_t
を使用して任意に大きなオフセットを管理する関数fsetpos
がありますが、それは複雑さの範囲をもたらします。 fsetpos
は、私が本当に大きなサイズのオフセットを本当に使用していれば意味があるかもしれませんが、可能な限り大きなオフセットがuint32_tであることを知っているので、ダブルシークはその必要性を満たしています。
この解決策では、すべてのTIFFファイルを32ビットシステムで処理できることに注意してください。 PixInsightのような商用プログラムを考えるなら、これの利点は明らかです。 PixInsightは、32ビットシステムで動作する場合、2147483648バイトより小さいTIFFファイルしか処理できません。フルサイズのTIFFファイルを処理するには、64ビットコンピュータで64ビット版のPixInsightを使用する必要があります。これはおそらく、PixInsightプログラマが内部的にオフセットを処理するために64ビットタイプを使用したためです。私のソリューションは32ビットタイプのみを使用しているので、32ビットシステムでフルサイズのTIFFファイルを扱うことができます(基本的なオペレーティングシステムがそのファイルを大量に処理できる限り)。
あなたはどのOSですか? 32ビットアーキテクチャを使用していますか? – melpomene
@melpomeneコードは、32ビットと64ビットの両方のアーキテクチャで動作する必要があり、異なるマシンやオペレーティングシステムで実行できます。 –
2または4GBを超えるTIFFファイルは珍しいことではありません。あなたのCRTには長い議論が必要な選択肢があります。あなたはそのドキュメントを見なければなりません。 –