help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Read/Write binary files using C++ bindings


From: Chidambaram Annamalai
Subject: Read/Write binary files using C++ bindings
Date: Wed, 9 Jun 2010 20:19:45 +0530

I have the following piece of code to write and read a matrix to and
from a file in binary. The writing works fine but the reading code
gives a Segmentation Fault error.

According to the C++ API doc:

OCTINTERP_API std::string read_binary_data      (       std::istream &          
is,
                bool    swap,
                oct_mach_info::float_format     fmt,
                const std::string &     filename,
                bool &          global,
                octave_value &          tc,
                std::string &   doc     
        )                       

and I have provided the read_binary_data function with arguments
accordingly (closely following the implementation of do_load(..) from
here [1])

#include <iostream>
#include <fstream>

// BEGIN CODE

// octave headers
#include <octave/oct.h>
#include <octave/octave.h>

#include <octave/dMatrix.h>       /* Real double precision matrices */
#include <octave/oct-rand.h>      /* Random number generator        */
#include <octave/load-save.h>     /* Load/Save                      */
#include <octave/ls-oct-binary.h> /* Binary format                  */

int
main(int argc, char **argv)
{
    Matrix A(2,2);
    A(0,0) = 1.0; A(0,1) = 2.0;
    A(1,0) = 3.0; A(1,1) = 4.0;

    std::cout << A << std::endl;

    std::ofstream os;
    bool global(false), writefloat(true);

    os.open("A.bin");
    write_header (os, LS_BINARY);
    save_binary_data (os, octave_value (octave_value (A)),
                     std::string("A"), std::string(""),
                     global, writefloat);
    os.close();

    std::ifstream is;
    bool swap;
    std::string name, doc;
    octave_value B;
    oct_mach_info::float_format flt_fmt;

    is.open("A.bin");
    read_binary_file_header (is, swap, flt_fmt);
    read_binary_data (is, swap, flt_fmt, name, global, tc, doc);
    is.close();

    return 0;
}

// END OF CODE

For convenience here's the Makefile that I used to compile it:

all: readwrite
readwrite: readwrite.o
        mkoctfile --link-stand-alone -o readwrite readwrite.o
readwrite.o: readwrite.cpp
        g++ -c -I/usr/include/octave-3.0.1/octave/
-I/usr/local/cuda/include/ -o readwrite.o readwrite.cpp

Help? :)

Best,
Chillu

[1]: 
http://octave3.0.sourcearchive.com/documentation/3.0.5/load-save_8cc-source.html


reply via email to

[Prev in Thread] Current Thread [Next in Thread]