如何使用动态数组成员读写二进制文件C ++中的类

时间:2018-12-31 18:26:25

标签: c++

问题:我在仅使用 C ++ stl 以二进制模式读写文件时遇到了问题。我班上有2个整数成员,告诉我矩阵的大小和实际的矩阵本身。矩阵是动态的,但是我认为这是为什么我的读取请求都不正确的主要原因。所以我的问题是如何使用动态数组成员读取/写入类。

我尝试过的操作:先动手读取矩阵的大小,然后为矩阵数组分配内存。但是出于某种原因,尽管我已经为它留出了一些空间,但我的调试器只是一直说这是分段错误。我什至试图使两个类具有相同的成员值,但仍然没有任何作用

class MaTrix{
private :
    int row, column;
    float ** maTrix_arr;
}
void outFile(){
    ofstream of("matrix.inp", ios::binary | ios::app) ;
    of.write(reinterperted_cast<char*>(this), sizeof(*this)) ;
}
void inFile(){
    ifstream ifs("matrix.inp", ios::binary | ios::app) ; // if I don't use app it will delete my file for some reason
    // I do some more allocation here to make sure the Matrix is of suitable size
    // Long code short I tried to get the two integers row and column out and it works as intended
    // Then I allocate some memory for this->maTrix_arr, also making sure I reset the file pointer
    ifs.read(reinterperted_cast<char*>(this), sizeof(*this)) ;
}
};

1 个答案:

答案 0 :(得分:1)

您真正想要的是一些serialization库。而且您可能想使用containers,因此您可以将一些std::vector<double>序列化为一个向量,然后定义自己的template matrix<typename ElementType>(或者最好在{{3}中找到一个) },以满足您的需求)。当然,您需要为矩阵定义Boost(因此需要对它们进行所有操作的集合)。顺便说一句,abstract data type答案(针对C)和this可能会激发您的灵感。

您显然不应该在文件中写入原始指针,因为它们仅对您的that有意义。即使您在两个不同的进程中以相同的状态(例如相同的矩阵)运行相同的程序,它们也会使用不同的指针地址(例如由于process)。您想编写(然后阅读)矩阵的内容

您可能对现有的序列化库(例如ASLR)或至少对中性二进制格式(例如s11nXDR)感兴趣。您可能应该关心ASN1(例如,如果在Sparc或ARM计算机上读取用x86编写的二进制文件)。

您可以决定以某种文本格式(或endianess)进行序列化,例如text-based protocol(或YAML等)。这对开发人员(和调试人员)更加友好。您可以找到很多与C ++相关的JSON相关库,例如JSON

如果不允许使用外部库,则可以重新发明文本文件(可能以jsoncpp表示)()(受JSON或{{3}的启发) })并轻松实施(使用常规的EBNF技术,例如S-exprs)。

如果需要使用二进制格式,则需要指定它(再次使用EBNF表示法应该有帮助)并实现它(再次,这是解码时的解析问题;编码通常要简单得多)。

您可能很想对每个矩阵元素进行一次编码(和解码)。一旦您的抽象数据类型具有获取(或更改)某些单个矩阵元素的值的操作,那就没什么大不了了。

也请阅读parsing