2015-12-10 84 views
0

當我嘗試在C++中編寫犰狳字段對象並讀取它時,它運行良好。示例代碼是:難以閱讀犰狳字段數據結構

//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場的尺寸,所以我知道它可以從文件中讀取,那麼爲什麼我不能讀取保存在該領域的矩陣?

回答

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:"); 
1

這裏的問題很有可能是你寫的結構field<mat>沒有考慮班級中的實際數據。

例如,指向內存的指針僅在單個進程中有效。如果你寫一個指向文件的指針並試圖從另一個程序中讀取並使用它,該指針不再指向分配的數據,並且取消引用該指針將導致未定義的行爲,並且很可能像您擁有的那樣崩潰。

您需要研究serialization的主題來解決此問題。

+0

謝謝你的建議@Joachim,我會讀你推薦的主題。 –