ECCODES C API:如何更新多消息GRIB的offset、count与countTotal键
解决GRIB多消息文件offset和count字段不更新的问题
首先明确:offset和count这两个字段不属于单个GRIB消息的内容,它们是多消息GRIB文件的全局索引元数据,由文件的索引结构维护,而非存储在每个消息内部。所以你直接修改单个句柄h的这两个字段会提示只读,这是库的正常设计逻辑。
正确处理方式
无需手动设置单个句柄的offset和count
使用codes_grib_multi_handle_write()写入多消息文件时,库会自动计算并维护每个消息的offset和count信息,这些数据会被存入文件的索引区域,而非单个消息本身。写入完成后验证索引正确性
若要确认offset和count是否正确,需在文件写入完成后,用多句柄重新读取文件并遍历消息查看:#include <stdio.h> #include <stdlib.h> #include "eccodes.h" int main() { FILE* fp = fopen("output.grib", "r"); if (!fp) { perror("Failed to open file"); return 1; } codes_grib_multi_handle* mh = codes_grib_multi_handle_new_from_file(NULL, fp); if (!mh) { perror("Failed to create multi handle"); fclose(fp); return 1; } long count, countTotal, offset; codes_grib_handle* h = NULL; int i = 0; while ((h = codes_grib_multi_handle_get(mh, i)) != NULL) { CODES_CHECK(codes_get_long(h, "count", &count), 0); CODES_CHECK(codes_get_long(h, "countTotal", &countTotal), 0); CODES_CHECK(codes_get_long(h, "offset", &offset), 0); printf("Message %d: count=%ld, countTotal=%ld, offset=%ld\n", i+1, count, countTotal, offset); codes_handle_delete(h); i++; } codes_grib_multi_handle_delete(mh); fclose(fp); return 0; }运行这段代码就能看到每个消息正确的offset和count值。
关于你之前的尝试
你之前获取单个消息大小、计算offset的逻辑没问题,但没必要手动设置到句柄里——这些值不会被写入单个消息,最终文件的索引是由多句柄在写入时自动生成的。
内容的提问来源于stack exchange,提问作者user2030243
相关产品推荐
相关产品推荐

