古いWin64C++ ツールチェーン(bcc64)のSTLでは、64ビットとしてコンパイルした場合でも、ファイルの最大サイズは4GBでした。つまり、大きなサイズのファイルを処理するためにfstreamやiostreamなどの入出力ライブラリを使用すると、メモリ不足などが原因で正しく動作しませんでした。
C++Builder 12.2の新しいWin64C++ ツールチェーン(bcc64x)のRTLでは、4GB以上のファイルサイズの扱いはサポートしていますが、コンパイラオプションのデフォルトは、以前と同様にファイルの最大サイズは4GBのままです。
4GB以上のファイルを扱うためには、コンパイラオプションとして「_FILE_OFFSET_BITS=64」を定義してください。
例えば、C++Builder 12.2のWindows 64ビット(モダン)の[プロジェクト] > [オプション] > [ビルド] > [C++コンパイラ] > [拡張] > [その他のオプション]の”コンパイラに渡す追加オプション”に「-D_FILE_OFFSET_BITS=64」を定義してください。(下図を参照)
コマンドライン上でビルドする場合も同様です。
但し、古いWin64C++ ツールチェーン(bcc64)に対して、同じコンパイラオプションを指定しても適用されませんのでご注意ください。
なお、現在 C++Builderの次期リリースでは、このコンパイラオプションをデフォルトにするか検討中です。
ボーナスヒント:Delphi RTLのTEncoding クラスを確認してください。ストリームサポートと併用することで、C++ RTLで提供されているデフォルトのクラスよりもはるかに簡単にテキストエンコーディングを処理できます。さらにもちろん、64ビットファイルサイズにもすでにサポートされており、TBufferedFileStreamで優れたパフォーマンスが得られます。しかし、STLを使用したい場合は、新しいC++Builderでも問題ありません。
ウェビナーについて
本ブログの内容は、エンバカデロのC++のブロダクトマネージャである「David Millington」が、ウェビナー内で「Tip #3, Massive Files with iostreams」で解説しています。このウェビナーはC++Builder / RAD Studio 12.2の新しいWin64 モダンツールチェインを活用するためのヒントや非常に有益な情報を紹介しています。もしウェビナー(英語)をご覧になりたい場合は、以下をご参照ください。
「Tip #3, Massive Files with iostreams」の節は、下記の動画の「1:05:02〜」です。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition