我有一个矢量,其大小可能非常大(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?
答案 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)