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;
}