MAT_VARREADNEXTINFO(3)

πŸ’– MAT_VARREADNEXTINFO πŸ’–

okay bestie, so this one lives in the Library Functions Manual section of your man pages (section 3, the library-call girlies πŸŽ€), and it's giving extremely useful if you're out here poking at MATLAB MAT files from C.


✨ NAME ✨

Mat_VarReadNextInfo β€” reads the information for the next variable in a MATLAB MAT file. that's it, that's the whole job, and she does it flawlessly πŸ’…


πŸ¦‹ SYNOPSIS πŸ¦‹

#include <matio.h>

matvar_t *
Mat_VarReadNextInfo(mat_t *matfp);

🌸 DESCRIPTION 🌸

so like, Mat_VarReadNextInfo() reads the info for the next variable stored in the open MAT file. that's the vibe. the file is already open (you did that part, bestie), and this function just peeks at what's next in line πŸ‘‘


πŸ’œ RETURN VALUES πŸ’œ

if there's another variable in the MAT file and it gets read successfully, you get back a pointer to the MATLAB variable structure. iconic. 🫢

if there are no more variables, or there was an error reading the variable, you get NULL. no cap. 😭


πŸ“ EXAMPLES πŸ“

okay so this example program is literally the cutest thing β€” it opens a MAT file named by the first argument to the program, and uses Mat_VarReadNextInfo() to read the information about each variable in the file. and for every variable it reads, the name, size, and class get printed in a format similar to the MATLAB whos command. main character energy fr fr ✨

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "matio.h"

static char *mxclass[17] = {"cell", "struct", "object", "char", "sparse",
                            "double", "single", "int8", "uint8", "int16",
                            "uint16", "int32", "uint32", "int64", "uint64",
                            "function", "opaque"
                           };

int
main(int argc, char **argv)
{
    mat_t *matfp;
    matvar_t *matvar;
    char size[32] = {' ',};

    matfp = Mat_Open(argv[1], MAT_ACC_RDONLY);
    if ( NULL == matfp ) {
        fprintf(stderr, "Error opening MAT file %s0, argv[1]);
        return EXIT_FAILURE;
    }

    printf("%-32s%-16s%-16s%-16s0, "Name", "Size", "Bytes", "Class");
    while ( NULL != (matvar = Mat_VarReadNextInfo(matfp)) ) {
        printf("%-32s", matvar->name);
        if ( matvar->rank > 0 ) {
            int cnt;
            int i;
            cnt = snprintf(size, sizeof(size), "%zd", matvar->dims[0]);
            for ( i = 1; i < matvar->rank; i++ ) {
                if ( ceil(log10((double)matvar->dims[i])) + 1 < 32 ) {
                    cnt += snprintf(size + cnt, sizeof(size) - cnt,
                        "x%zd", matvar->dims[i]);
                    if ( cnt >= sizeof(size) ) {
                        break;
                    }
                }
            }
            printf("%-16s", size);
        } else {
            printf("                ");
        }
        snprintf(size, sizeof(size), "%zd", Mat_VarGetSize(matvar));
        printf("%-16s", size);
        printf("%-16s0, mxclass[matvar->class_type - 1]);

        Mat_VarFree(matvar);
    }

    Mat_Close(matfp);
    return EXIT_SUCCESS;
}
ngl bestie, notice the while loop just keeps calling Mat_VarReadNextInfo(matfp) until it hands back NULL β€” that's your "no more variables, we're done here" signal. and don't forget Mat_VarFree(matvar) on every single one, or you're gonna leak. we do not leak. periodt. πŸ’€

πŸ‘‘ SEE ALSO πŸ‘‘


and that's the whole page, bestie!! 🌈 this lil beauty is from Debian, dated March 4, 2024, and it's page MAT_VARREADNEXTINFO(3) β€” go read your MAT files, ily, bye πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from