std::vector<cv::Point3f> data;
//loop invoking
//cv::Point3f p; p.x=..; p.y=..; p.z=.. and data.push_back(p)
std::ofstream myFile("data.bin", ios::out || ios::binary);
myFile.write(reinterpret_cast<char*> (&data[0]), sizeof(cv::Point3f)*data.size());
myFile.close();
int size = data.size();
ifstream input("data.bin", ios::binary);
input.read(reinterpret_cast<char*> (&data[0]), sizeof(cv::Point3f)*size);
这总是以“调试断言失败”:“vector 下标超出范围”结束。
那这不可能吗?我的首要任务是速度。我想尽可能快地阅读和写作。 (因此需要二进制文件)。
最佳答案
好吧,您正在将数据写入根本不存在的 vector 元素中。
这种方法行不通。请改用 std::copy
和 std::back_inserter
!我对 cv::Point3f
的布局知之甚少,无法轻松地为您提供代码示例。
但是,如果我只是从 std::cin
流中读取单个 char
,那么它看起来像这样:
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<char> data;
std::copy(
std::istream_iterator<char>(std::cin),
std::istream_iterator<char>(), // (this magic is like "end()" for streams)
std::back_inserter(data)
);
std::cout << data.size() << '\n';
}
// Output: 3
( live demo )
您可以以此为起点,改为读取 sizeof(cv::Point3f)
block ,并执行必要的转换。
关于c++ - 将 vector 写入和读取到二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30376667/