1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
/*
* C Implementation: bufr_attributes
*
* Description: how to read attributes of keys in BUFR messages.
*
*/
#include "eccodes.h"
int main(int argc, char* argv[])
{
FILE* in = NULL;
/* message handle. Required in all the eccodes calls acting on a message.*/
codes_handle* h = NULL;
char* units = NULL;
char* unitsPercent = NULL;
long longVal;
double doubleVal;
size_t len = 0;
int err = 0;
int cnt = 0;
const char* infile = "../../data/bufr/syno_multi.bufr";
in = fopen(infile, "rb");
if (!in) {
fprintf(stderr, "Error: unable to open file %s\n", infile);
return 1;
}
/* loop over the messages in the bufr file */
while ((h = codes_handle_new_from_file(NULL, in, PRODUCT_BUFR, &err)) != NULL || err != CODES_SUCCESS) {
if (h == NULL) {
fprintf(stderr, "Error: unable to create handle for message %d\n", cnt);
cnt++;
continue;
}
printf("message: %d\n", cnt);
/* we need to instruct ecCodes to expand the descriptors
i.e. unpack the data values */
CODES_CHECK(codes_set_long(h, "unpack", 1), 0);
/* ----------------------------------------------------------------
We will read the value and all the attributes available for
the 2m temperature.
-------------------------------------------------------------------*/
/* get the value as double */
CODES_CHECK(codes_get_double(h, "airTemperatureAt2M", &doubleVal), 0);
printf(" airTemperatureAt2M: %.2f\n", doubleVal);
/* get the element's code (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->code", &longVal), 0);
printf(" airTemperatureAt2M->code: %ld\n", longVal);
/* get the element's units (see BUFR code table B) */
/* get the size and allocate memory*/
CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->units", &len), 0);
units = (char*)malloc(len * sizeof(char));
/* get the values*/
codes_get_string(h, "airTemperatureAt2M->units", units, &len);
printf(" airTemperatureAt2M->units: %s\n", units);
/* get the element's scale (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->scale", &longVal), 0);
printf(" airTemperatureAt2M->scale: %ld\n", longVal);
/* get the element's reference (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->reference", &longVal), 0);
printf(" airTemperatureAt2M->reference: %ld\n", longVal);
/* get the element's width (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->width", &longVal), 0);
printf(" airTemperatureAt2M->width: %ld\n", longVal);
/* -----------------------------------------------------------------
The 2m temperature data element in this message has an associated
field: percentConfidence. Its value and attributes can be accessed
in a similar manner as was shown above for 2m temperature.
----------------------------------------------------------------- */
/* get the value as long */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence", &longVal), 0);
printf(" airTemperatureAt2M->percentConfidence: %ld\n", longVal);
/* get the element's code (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->code", &longVal), 0);
printf(" airTemperatureAt2M->percentConfidence->code: %ld\n", longVal);
/* get the element's units (see BUFR code table B) */
/* get the size and allocate memory*/
CODES_CHECK(codes_get_length(h, "airTemperatureAt2M->percentConfidence->units", &len), 0);
unitsPercent = (char*)malloc(len * sizeof(char));
/* get the values*/
codes_get_string(h, "airTemperatureAt2M->percentConfidence->units", unitsPercent, &len);
printf(" airTemperatureAt2M->percentConfidence->units: %s\n", unitsPercent);
/* get the element's scale (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->scale", &longVal), 0);
printf(" airTemperatureAt2M->percentConfidence->scale: %ld\n", longVal);
/* get the element's reference (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->reference", &longVal), 0);
printf(" airTemperatureAt2M->percentConfidence->reference: %ld\n", longVal);
/* get the element's width (see BUFR code table B) */
CODES_CHECK(codes_get_long(h, "airTemperatureAt2M->percentConfidence->width", &longVal), 0);
printf(" airTemperatureAt2M->percentConfidence->width: %ld\n", longVal);
/* free allocated arrays */
free(units);
free(unitsPercent);
/* delete handle */
codes_handle_delete(h);
cnt++;
}
fclose(in);
return 0;
}
|