读取和写入vector <bool>到c ++中的文件</bool>

时间:2012-07-04 00:33:15

标签: c++ file-io vector

我有一个矢量,其大小可能非常大(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;
}

[edit]写入后关闭文件,输出与输入非常不同。

1.0.1.0.1.
SIZE: 6
1.1.1.0.1.1.

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

3 个答案:

答案 0 :(得分:6)

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

即使这种结构允许您访问向量的原始内存,您用来写出数据的代码也与您用于读取数据的代码不兼容。您用来写出数据的代码会将8个bool条目打包到每个char中,但是您用来读取的代码数据会将每个char转换为单个bool

由于您使用istreambuf_iterator来回读数据,为什么不以相同的方式写出来:

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

每个字节写出一个bool

如果你想在每bool写一位的压缩表示中写出数据,我认为你需要发明自己的输入和输出迭代器。

答案 1 :(得分:1)

vector<bool>不是真正的vector。您在其他地方找到的用于处理载体的代码,不会。你不能忽视“临时的地址”。这一行

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

不适用于vector<bool>

问题在于,您所采用的地址不是您认为的类型。

答案 2 :(得分:-2)

尝试使用AND opperation:

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

你应该查看运算符重载并创建一个运算符,返回文件中的下一个unsigned char,然后使用atoi将值转换为整数

实施例

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

以上只是一个例子(未经过测试。暂时没有使用c ++模板,因此可能需要重新加工

祝你好运,

Alexander Frankland(Tandex)