この関数は以下に述べる状況下での書き込みを最適化するための高度な使用を目的としています。関数 nc_set_fill は書き込み用に開かれたNetCDFファイルの フィルモード を設定し、返しの引数として現行のモードを返します。フィルモードは NC_FILL 又は NC_NOFIL のどちらででも設定でき、 NC_FILL に対応したデフォルト状態はデータがフィル値によって既に埋められているというものです。即ち、非記録型変数を生成する際、もしくは未だに書き込まれていないデータを超えた値を記入する際に、フィル値が記入されます。これによって書き込まれる前にデータを読み取ってしまうことを感知できます。フィル値の使用法の 詳細については、 7.16 - フィル値。独自のフィル値の定義の仕方については 8.1 - 属性の慣習。
NC_NOFILL に対応する動作は、データをフィル値で満たそうとするデフォルト動作を無効にします。これによって、NetCDFライブラリがフィル値を書き込み、さらにそれらの値が後にデータによって上書きされるという二重の操作を避けることができ、パフォーマンスが向上します。
返り値によってNetCDFファイルがどのモードにあったかということが分かります。この値を利用して、開かれたNetCDFファイルのフィルモードを一時的に変更し、後で元のモードに復旧させることが出来ます。
開かれたNetCDFファイルを NC_NOFILL モードにした後は、後で読み取られる全ての位置に有効なデータが書き込まれていることを確認してください。nofillモードは書き込み用に開かれたNetCDFファイルの一時的な性質でしかない点に注意してください。ファイルを一旦閉じて再度開いたときには、デフォルト動作に戻ります。又、フィルモードを陽に NC_FILL に設定するために、再び nc_set_fill を呼び出すことによってデフォルト動作に戻ることが出来ます。
nofillモードを設定することが有益な場合が3つあります。
もし、NetCDFファイルが無制限次元を持ち、最後の記録がnofillモードにおいて書き込まれた場合には、nofillモードが設定されていない場合に比べてファイルが短い可能性がある。 しかし、これはNetCDFインターフェースを通してのみデータアクセスすれば完全に透過性は保たれる。
将来のリリースでは、この機能はなくなっている(又は不必要)であるかもしれない。プログラマーの方はこの機能に必要以上に頼らないことが望ましい。
この 例では nc_set_fill を使って、 foo.nc というNetCDFファイルの連続書き込みのnofillモードを設定します。
#include <netcdf.h>
...
int ncid, status, old_fill_mode;
...
status = nc_open("foo.nc", NC_WRITE, &ncid); /* 書き込み用に開く */
if (status != NC_NOERR) handle_error(status);
... /* デフォルトprefill設定でデータを書き込む */
status = nc_set_fill(ncid, NC_NOFILL, &old_fill_mode); /* nofill設定 */
if (status != NC_NOERR) handle_error(status);
... /* prefill無しでデータを書き込む */