ECCODES C API: обновление смещения ключей, счетчика и countTotal

я используюcodes_grib_multi_handle_write()функция для создания таблицы нескольких сообщений путем итерации поh = codes_grib_handle_new_from_samples(NULL,"GRIB2"). Каждый дескриптор добавляется к мульти-дескриптору.mhс функциейcodes_grib_multi_handle_append(h, startSection, mh)Кажется, что ключ «смещения» сообщений полученного мультигриба остается на уровне 0, а ключ «count» остается на уровне 1. Увеличивается только ключ «countTotal». Есть ли способ увидеть обновление этих ключей в зависимости от количества присутствующих сообщений? Я пытался :

      // set offset
size_t totalLength = 0, size2 = 0;
const void* buffer = NULL;

CODES_CHECK(codes_get_message_size(h,&totalLength),0);
buffer=(unsigned char*)malloc(totalLength*sizeof(char));

CODES_CHECK(codes_get_message(h, &buffer, &size2),0);
fprintf(stderr,"size in loop : %ld\n", size2);
//CODES_CHECK(codes_set_long(h, "offset", offset),0); //=> pb en read only !!
//CODES_CHECK(codes_set_long(h, "count", count),0); //=> pb en read only !!
offset += size2;
count += 1;

1 ответ

The codes_grib_multi_handle_write()иcodes_grib_multi_handle_append()функции не подходят для записи нескольких сообщений в один файл. Он используется для написания многополевой таблицы. Вот почему необходимо использовать функцииcodes_get_messageиfwrite. Вот краткий пример, любезно предоставленный командой ЕЦСПП, благодаря им:

      #include <stdio.h>
#include "eccodes.h"
int main(int argc, char* argv[])
{
    FILE* in                    = NULL;
    FILE* out                   = NULL;
    codes_handle* h = NULL;
    const void* buffer          = NULL;
    size_t size                 = 0;
    int err                     = 0;

    if (argc != 3) return 1;

    codes_grib_multi_support_on(NULL); /* NOTA BENE */

    in  = fopen(argv[1], "rb");
    out = fopen(argv[2], "wb");

    /* loop over the messages in the source grib and copy them */
    while ((h = codes_handle_new_from_file(0, in, PRODUCT_GRIB, &err)) != NULL) {
        CODES_CHECK(codes_get_message(h, &buffer, &size), 0);
        if (fwrite(buffer, 1, size, out) != size) {
            perror(argv[1]);
            return 1;
        }
        codes_handle_delete(h);
    }
    fclose(out);
    fclose(in);
    return 0;
}
Другие вопросы по тегам