从二进制文件C ++中读取结构的向量

时间:2017-03-03 14:39:14

标签: c++ vector struct

我使用的脚本结构摄像机的矢量写入二进制文件:

ofstream file;
file.open(cameraParamFile.c_str(), ios_base::binary);
const char* pointer = reinterpret_cast<const char*>(&cameras[0]);
size_t bytes = cameras.size() * sizeof(cameras[0]);
file.write(pointer, bytes);

这就是结构的样子:

struct CV_EXPORTS CameraParams
{
    CameraParams();
    CameraParams(const CameraParams& other);
    const CameraParams& operator =(const CameraParams& other);
    Mat K() const;

    double focal; // Focal length
    double aspect; // Aspect ratio
    double ppx; // Principal point X
    double ppy; // Principal point Y
    Mat R; // Rotation
    Mat t; // Translation
};

这是矢量声明:

vector<CameraParams> camerasTest

现在当我尝试从这个文件中读取时,我无法做到(仍然是c ++的新手)。它给出了错误,说明没有匹配函数来调用&#39; std :: basic_ifstream :: read(std :: vector ,size_t&amp;)&#39; | *。

这是我的尝试:

vector<CameraParams> camerasTest;
ifstream inf1;
inf1.open(cameraParamFile.c_str(), ios::binary | ios::in);
inf1.read(&camerasTest, bytes));

我认为这是与类型转换或错误参数相关的问题。有人可以指出正确的方法吗?

我试过阅读下面提到的链接但是没有多大意义: Write and load vector of structs in a binary file c++

修改

正如评论中所建议的,我尝试使用上述链接实现自定义阅读器和编写器。这是我写的功能。它仍然无效。

void writeStruct(ostream& out, const vector<CameraParams> &vec)
{ 
    typename vector<CameraParams>::size_type size = vec.size();
    os.write((char*)&size, sizeof(size));
    os.write((char*)&vec[0], vec.size() * sizeof(CameraParams));
}

void readStruct(istream& is, vector<CameraParams> &vec)
{
    typename vector<CameraParams>::size_type size = 0;
    is.read((char*)&size, sizeof(size));
    vec.resize(size);
    is.read((char*)&vec[0], vec.size() * sizeof(CameraParams));
}

当我尝试使用以下脚本使用上述读取功能打印值时:

vector<CameraParams> cameraTest;
std::ifstream in(cameraParamFile.c_str(), std::ios::in | std::ios::binary);
readCameraParamsVector(in, cameraTest);
in.close();

cout << cameraTest[0].R;
cout << "\n";
cout << cameras[0].R;

它开始给我一个运行时错误,说进程终止,状态为-1073741819

编辑2 正如评论中所提到的,为什么我无法使用链接Write and load vector of structs in a binary file c++中提到的答案?我在编辑1中已经提到我使用该链接编写了写入和读取函数,但仍然给出了如上所示的错误。

0 个答案:

没有答案