c++ - 将 vector 写入和读取到二进制文件

标签 c++

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::copystd::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/

相关文章:

C++ - 字符串匹配的值?

c++ - 元编程成员检查器不适用于返回具有基类的类型的函数成员

c++ - haskell FFI : Interfacing with simple C++?

c++ - 模板基类的模板运算符重载

c++ - 使用 C++ 过滤 CSV 数据

c++ - 如何使用 strcpy_s() 将多个 char* 字符串复制到一个字符串中?

c++ - 程序崩溃,程序收到信号 EXC_BAD_ACCESS,无法访问内存。原因: KERN_PROTECTION_FAILURE at address: 0x00000000

c++ - C/C++ 结构,在缓冲区中包含位字段

c++ - 运算符重载时局部变量发出警告,按照教程,不知道该怎么办

c++ - Drd - 如何解释这个 "Other segment"调用堆栈?