fout.write((char*)&bt, sizeof bt)
fin.read((char*)&rebt, sizeof bt)
又不是传统数据类型,输入输出的时候怎么会可以这样……
#include <iostream>#include <fstream>
#include <boost/dynamic_bitset.hpp>
using namespace boost
using namespace std
int main()
{
int a=5
int i
dynamic_bitset<> bt(a)
for(i=0 i<a i++)
团祥哪 {
cout<<bt[i]<<" "
}
cout<<endl
for(i=0 i<a i++)
{
塌码 if(i%2==0)
{
bt.push_back(true)
}else
{
bt.push_back(false)
}
}
int len = bt.size()
cout<<"bt含有:"<<len<<" 个元素。"
cout<<endl
//因为用的是动态分配,所以不能用sizeof去获取
//int capa = sizeof bt
//cout<<"bt占用"<<capa<<"个字节。"
int capa = bt.num_blocks() * sizeof(dynamic_bitset<>::block_type)
cout<<"bt占用"宴迅<<capa<<"个字节。"
cout<<endl
for(i=0 i<len i++)
{
cout<<bt[i]<<" "
}
cout<<endl
ofstream fout("D:/dybit.dat", ios_base::out | ios_base::binary)
//取出原始数据,再写入文件
int nBlockCount = bt.num_blocks()
dynamic_bitset<>::block_type* blocks = new dynamic_bitset<>::block_type[nBlockCount]
to_block_range(bt, blocks)
fout.write((char*)blocks, nBlockCount * sizeof(*blocks))
delete[] blocks
//关闭文件,免得打不开
fout.close()
ifstream fin("D:/dybit.dat", ios_base::in | ios_base::binary)
dynamic_bitset<> rebt(len)
//先读出原始数据,再恢复到对象
dynamic_bitset<>::block_type* newBlocks = new dynamic_bitset<>::block_type[nBlockCount]
fin.read((char*)newBlocks, nBlockCount * sizeof(*newBlocks))
fin.close()
from_block_range(newBlocks, newBlocks + nBlockCount, rebt)
delete[] newBlocks
for(i=0 i<len i++)
{
cout<<rebt[i]<<" "
}
cout<<endl
return 0
}
我提个思路。字节是计算机 *** 作的实际最基本单位,任何地址只能精确到字节而无郑腊橡法精确到位的。所以LZ一定要将位整合到以字节为单位才能进行其他 *** 作喊旁。可以这么做,将二进制流按照每8位一个单位装成一个字节,并明确好字节之间的顺序局铅,字节内高低位的顺序,最后末尾不足的要塞一些没意义的但LZ要知道的位凑足成字节。这里面当然必须反复用到位运算。
通常的做法是字节之间的顺序按照自然字节地址由小到大顺序,字节内低位在前。比如对于已经整合成字节的字节流a[N],查看第 i 个位(从0起)的算法是 a[i/8] &(1<<(i%8))。
不同的位序约定会稍有不同位 *** 作
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)