text: #include "hdf.h"
  
  #define  N_RECORDS       20      /* number of records to be read */
  #define  N_FIELDS        2       /* number of fields to be read */
  #define  FILE_NAME       "Packed_Vdata.hdf"
  #define  VDATA_NAME      "Mixed Data Vdata"
  #define  FIELDNAME_LIST  "Temp,Ident"
  
  /* number of bytes of the data to be read */
  #define  BUFFER_SIZE     ( sizeof(float32) + sizeof(char)) * N_RECORDS 
  
  int main ()
  {
     /************************* Variable declaration **************************/
  
     intn  status_n;      /* returned status for functions returning an intn  */
     int32 status_32,     /* returned status for functions returning an int32 */
           file_id, vdata_id, 
           num_of_records,        /* number of records actually read */
           vdata_ref,             /* reference number of the vdata to be read */
           buffer_size;           /* number of bytes the vdata can hold       */
     float32 itemp[N_RECORDS];    /* buffer to hold values of first field     */
     char  idents[N_RECORDS];     /* buffer to hold values of fourth field    */
     uint8 databuf[BUFFER_SIZE];  /* buffer to hold read data, still packed   */
     VOIDP fldbufptrs[N_FIELDS];/*pointers to be pointing to the field buffers*/
     int   i;
  
     /********************** End of variable declaration **********************/
  
     /*
     * Open the HDF file for reading. 
     */
     file_id = Hopen (FILE_NAME, DFACC_READ, 0);
  
     /*
     * Initialize the VS interface. 
     */
     status_n = Vstart (file_id);
  
     /*
     * Get the reference number of the vdata, whose name is specified in
     * VDATA_NAME, using VSfind, which will be discussed in Section 4.7.3.
     */
     vdata_ref = VSfind (file_id, VDATA_NAME);
  
     /*
     * Attach to the vdata for reading. 
     */
     vdata_id = VSattach (file_id, vdata_ref, "r");
  
     /*
     * Specify the fields that will be read. 
     */
     status_n = VSsetfields(vdata_id, FIELDNAME_LIST);
  
     /*
     * Read N_RECORDS records of the vdata and store the values into the 
     * buffer databuf. 
     */
     num_of_records = VSread (vdata_id, (uint8 *)databuf, N_RECORDS, 
                              FULL_INTERLACE);
  
     /*
     * Build an array of pointers each of which points to an array that
     * will hold all values of a field after being unpacked.
     */
     fldbufptrs[0] = &itemp[0];
     fldbufptrs[1] = &idents[0];
     
     /*
     * Unpack the data from the buffer databuf and store the values into the 
     * appropriate field buffers pointed to by the set of pointers fldbufptrs.
     * Note that the second parameter is _HDF_VSUNPACK for unpacking and the
     * number of records is the one returned by VSread.
     */
     status_n = VSfpack (vdata_id, _HDF_VSUNPACK, FIELDNAME_LIST, (VOIDP)databuf,
                 BUFFER_SIZE, num_of_records, NULL, (VOIDP)fldbufptrs);
  
     /*
     * Display the read data being stored in the field buffers.
     */
     printf ("\n     Temp      Ident\n");
     for (i=0; i < num_of_records; i++)
         printf ("   %6.2f        %c\n", itemp[i], idents[i]);
  
     /*
     * Terminate access to the vdata and the VS interface, then close 
     * the HDF file. 
     */
     status_32 = VSdetach (vdata_id);
     status_n = Vend (file_id);
     status_32 = Hclose (file_id);
     return 0;
  }
  