当我尝试用C ++在armadillo中编写一个字段对象然后读取它时,它运行良好。示例代码为:
//write the data to signal.bin file
ofstream outfile;
outfile.open("signal.bin", ios::binary | ios::out);
//CLASS_NUM is the size of field, signal is the data need to save;
outfile.write((char*)&CLASS_NUM, sizeof(int)); // sizeof can take a type
outfile.write((char*)&signal, sizeof(field<mat>));
outfile.close();
//read the saved data
ifstream inFile( "signal.bin", ios::binary );
int K;
inFile.read( reinterpret_cast< char* >( &K ), sizeof( int ) );
field<mat> Input_Signal(K, 1);
inFile.read( reinterpret_cast< char* >( &Input_Signal ), sizeof( field<mat> ) );
inFile.close();
我通过输出数据检查它们,它们匹配。但是,当我在代码中注释掉写入部分时,这意味着我有一个signal.bin文件,我需要读取它(代码的第二部分),
//read the saved data
ifstream inFile( "signal.bin", ios::binary );
int K;
inFile.read( reinterpret_cast< char* >( &K ), sizeof( int ) );
cout << K << endl;
field<mat> Input_Signal(K, 1);
inFile.read( reinterpret_cast< char* >( &Input_Signal ), sizeof( field<mat> ) );
inFile.close();
cout << Input_signal;
然后我有一个输出:
1
[field column 0]
Segmentation fault: 11
1是字段的维度,所以我知道它可以从文件中读取,那么为什么我无法读取保存在字段中的矩阵?
答案 0 :(得分:1)
这里的问题很可能是您在不考虑类中的实际数据的情况下编写结构field<mat>
。
例如,指向内存的指针仅在单个进程中有效。如果您编写指向文件的指针并尝试从另一个程序读取和使用它,该指针不再指向已分配的数据,并且取消引用此指针将导致未定义的行为并且很可能像你拥有的那个。
您需要研究serialization的主题来解决这个问题。
答案 1 :(得分:1)
field class已经包含saving and loading字段的函数,其中包含mat
的实例。
例如:
field<mat> F(2,3);
F(0,0).randu(4,5);
F(1,0).randu(6,7);
F.print("F:");
F.save("signal.bin");
field<mat> G;
G.load("signal.bin");
G.print("G:");