写入 boost::d ynamic_bitset 到文件
Write boost::dynamic_bitset to file
我正在实现香农-法诺编码算法,我想将符号代码输出为位。
例如,在下面的代码中,我逐行从输入文件(fin
流)中读取符号,用算法形成的符号代码(来自std::map<unsigned short, std::string> symbolCodes
)填充std::string
,然后用currentOutString
的内容构造boost::dynamic_bitset
。然后我尝试输出位集,但在输出文件中,位集中的每个"真"或"假"值占用 1 个字节而不是 1 位。
if (fin.is_open() && fout.is_open()) {
std::string currentInString;
std::string currentOutString;
while (getline(fin, currentInString)) {
boost::dynamic_bitset<> bitSet;
for (auto & ref : currentInString) {
currentOutString += symbolCodes[ref];
}
for (auto & ref : currentOutString) {
if (ref == '0') bitSet.push_back(0);
if (ref == '1') bitSet.push_back(1);
}
fout << bitSet;
bitSet.clear();
currentOutString.erase();
}
}
fout
流以std::ios_base::binary
模式打开。例如,我有单词"文件",代码e: 00, f: 01, i: 10, l: 11
。如何输出我的位集,所以输出文件占用 8 位而不是 8 字节?
提前感谢您的帮助,对于可能的语言错误,深表歉意。
这实际上不是dynamic_bitset
的错,而是iostream
的错。
打印以下代码
123----.
到cout
:
#include <iostream>
#include <boost/dynamic_bitset.hpp>
int main() {
using namespace std;
using namespace boost;
auto bitset = dynamic_bitset<>(32, 0x0a333231); // "123n" in little endian
bitset.append(0x2d2d2d2d); // "----"
bitset.append(0x0a2e); // ".n"
// bitset.size() is at least 96 here
auto ulong_mask = dynamic_bitset<>(bitset.size(), 0xFFFFFFFFul);
while(bitset.any()) {
unsigned long ulong = (bitset & ulong_mask).to_ulong();
cout.write(reinterpret_cast<char*>(&ulong), sizeof(ulong));
bitset >>= 32;
}
}
请注意使用 cout.write()
而不是 operator <<
。它按原样输出字节,没有任何格式和转换为 ASCII 字符串(想想itoa()
或类似的东西)。
还有一点:由于dynamic_bitset
不提供连续的存储保证和/或访问,我们必须按块读出大比特集,最好是更大的比特集;例如 unsigned long
.
在某些架构上,sizeof(unsigned long)
将是 8,所以我们实际上可以使用更大的ulong_mask
(ULONG_MAX
可以),并相应地移动 (8 * sizeof(unsigned long))
。使用它。(为便于说明,上文第32段为硬编码)。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 从文件中读取字符串并转换为 bitset<12>
- 如何在 c++ 中将二进制文件加载/读取到"vector<vector< bitset<32> >"中?
- 使用std::bitset生成二进制文件
- 将std::bitset写入二进制文件,然后将文件加载到std:bitset