0

我有一个向量,其大小可能非常大(100 万个元素)。我将向量的内容作为字节值写入文件。我无法弄清楚如何将字节值读回向量中。

这是代码:

#include <fstream>
#include <vector>
#include <iterator>
#include <iostream>
using namespace std;

int main()
{
  // Filling a vector with values
  std::vector<bool> ve;
  ve.push_back(true);
  ve.push_back(false);
  ve.push_back(true);
  ve.push_back(false);
  ve.push_back(true);
  // Printing the values of the vector
  for(unsigned int i = 0; i < ve.size(); i++)
      cout << ve.at(i) << ".";
  cout << endl;

  // Writing the vector contents to a file
  const char* file_name = "abc.txt";
  ofstream outfile(file_name, ios::out | ios::binary);
  outfile.write((const char*)&(ve[0]), ve.size());
  outfile.close();
  // Reading the file and filling the vector with values
  ifstream infile ("abc.txt", ifstream::binary);
  vector<bool> out_ve((std::istreambuf_iterator<char>(infile)),
                       std::istreambuf_iterator<char>());

  while( !infile.eof() )
      out_ve.push_back(infile.get());

  // Checking if the values read are the same as the original values
  cout << "SIZE: " << out_ve.size() << endl;
  for(unsigned int i = 0; i < out_ve.size(); i++)
    cout << out_ve.at(i) << ".";
  cout << endl;

  infile.close();
  return 0;
}

[编辑] 写入后关闭文件,输出与输入有很大不同。

1.0.1.0.1.
SIZE: 6
1.1.1.0.1.1.

如何将正确的元素放入向量 out_ve?

4

3 回答 3

7

无法从大多数 STL 容器写入数据,outfile.write((const char*)&(ve[0]), ve.size());因为它们以复杂的方式管理内存,而这对它们的操作方式至关重要。使用vector,它可以工作,因为内存存储是连续的,但vector<bool>它的特殊之处在于它将多个布尔值打包到一个字节中。正如评论者已经指出的那样,ve[0]返回一个特殊的临时准引用类型,并通过强制转换为 a 来写出该引用char*将产生与向量中的数据完全无关的东西。

即使这种构造使您可以访问向量的原始内存,您用来写出数据的代码也与您用来读入数据的代码不兼容。您用来写出数据的代码会将bool8个条目打包到每个.charcharbool

既然您正在使用 读取数据istreambuf_iterator,为什么不以同样的方式写出来:

std::copy(ve.begin(), ve.end(), std::ostreambuf_iterator<char>(outfile));

bool每个字节写出一个。

如果您想以每个写入一位的打包表示形式写出数据bool,我认为您需要发明自己的输入和输出迭代器。

于 2012-07-04T01:31:04.490 回答
1

vector<bool>不是真的vector。您在其他地方找到的用于处理向量的代码不会。并且您绝不能忽略“临时地址”。这条线

outfile.write((const char*)&(ve[0]), ve.size());

将无法正常工作vector<bool>

问题是您要获取地址的东西不是您认为的类型。

于 2012-07-04T01:24:51.137 回答
-2

试试这个 AND 操作:

#define logical_and(x, y)   ((x==y) ? x | y)

您应该研究运算符重载并创建一个返回文件中下一个无符号字符的运算符,然后使用 atoi 将值转换为整数

前任。

template<typename T>
  T operator << (ifstream& file)
  {
    return reinterpret_cast<T>(file.get());
  };

以上只是一个示例(未经测试。有一段时间没有使用 c++ 模板,因此可能需要返工

祝你好运,

亚历山大·弗兰克兰 (Tandex)

于 2012-07-04T01:08:47.590 回答