写入和读取矢量到二进制文件

Writing and reading vector to a binary file

本文关键字:二进制文件 读取      更新时间:2023-10-16
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);

总是以"debug assertion failed": "vector下标out of range"结束。

这是不可能的吗?我最看重的是速度。我想读和写得尽可能快。(所以需要二进制文件)。

你在把数据写入一个根本不存在的向量元素中。

这个方法是行不通的。用std::copystd::back_inserter代替!我不太了解cv::Point3f的布局,不能给你一个代码示例。

然而,如果我只是从std::cin流中读取单个char s,那么它看起来像这样:

#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

(现场演示)

您可以将此作为起点来读取sizeof(cv::Point3f)的块,并执行必要的转换。