如何将位集数据写入文件?

4
我有一个 std::bitset,我想按位写入文件,但是 fstream 的 write 函数不支持这种操作。除了使用 string 将每个 8 位组转换为 char 并写入外,我想不到其他的方法... 你们知道什么好办法吗?

很不幸,这种实现方式本来是非常好用的... - jokoon
2个回答

2

尝试:

#include <bitset>
#include <fstream>

int main() {
    using namespace std;
    const bitset<12> x(2730ul); 
    cout << "x =      " << x << endl;

    ofstream ofs("C:\\test.txt"); // write as txt
    if (ofs) {
        // easy way, use the stream insertion operator
        ofs << x << endl;

        // using fstream::write()
        string s = x.to_string();
        ofs.write(s.c_str(), s.length()); 
    }
    return 0;
}

不确定我理解了...什么是'mask'?为什么你创建一个const bitset,然后又用相同的名称创建另一个? - Tony R
已更新我的答案,请看看!那些是在快速编辑 SGI 的位集示例时留下的痕迹。 - dirkgently
好的,很棒。可以使用ofstream operator<<,但无法使用fstream.write()...请检查。 - Tony R
同时添加了 fstream::write() 的示例。 - dirkgently
5
将8位分组成一个字节并以二进制形式输出,可以将空间节省87.5%。 - moinudin

0

嗯,有一种方法是使用字符串作为序列化方法。有一个bitset构造函数接受一个字符串参数,还有一个to_string()成员函数返回一个字符串。还有<<和>>帮助运算符,它们使用构造函数和to_string()函数进行流插入和提取。根据您的要求,这可能适合您。

对于我们在一个应用程序中来说,这还不够紧凑,所以我们最终编写了一个类,看起来像bitset(具有相同的接口),但它也可以作为字节流进行序列化,这意味着它具有返回指向底层字节数组的指针的函数。如果您有多个实现源代码可供参考,编写起来并不太困难。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接