因为 ecCodes 仅能解码/编码加载过的 GRIB 消息,所以首先要加载消息。
有三个主要的函数用于加载一个 GRIB 消息。
codes_handle_new_from_file (NULL, f, PRODUCT_GRIB, &error) 或 grib_handle_new_from_file
从已经存在并使用 fopen 已打开的文件中加载 GRIB 消息。
codes_grib_handle_new_from_samples(NULL, 'regular_ll_sfc_grib2') 或 grib_handler_new_from_samples
从一个样例中加载 GRIB 消息,用于编码。后面会详细介绍。
codes_handle_new_from_index(index, &error) 或 grib_handle_new_from_index
从一个 index 中加载 GRIB 消息,index 需要事先创建好。后面会详细介绍。
上面三种加载函数将返回一个唯一的 grib handle,使用该 handle 可以操控已加载的 GRIB 消息。
无法直接访问包含已加载 GRIB 消息的缓存。缓存由 ecCodes 库内部处理。
任何 GRIB 消息占用的缓存都保存在内存中。
因此,当某个已加载的 GRIB 消息不再需要时,总应该调用 codes_handle_delete(handle) 函数释放其占用的空间。
#include <iostream>
#include <eccodes.h>
using namespace std;
int main(int argc, char** argv)
{
    if(argc < 2)
    {
        cout<<"Usage: "<<argv[0]<<" grib_file_path";
        return 1;
    }
    const char* file_path = argv[1];
    FILE* in = fopen(file_path, "rb");
    if(!in)
    {
        cout<<"ERROR: unable to open file "<<file_path<<endl;
        return 1;
    }
    int err = 0;
    codes_handle *h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err);
    if(h == nullptr)
    {
        cout<<"ERROR: unable to create handle from file "<<file_path<<endl;
        return 1;
    }
    codes_handle_delete(h);
    fclose(in);
    return 0;
}