基本上,我有我的霍夫曼表作为

std::map<std::string, char> ciMap;

其中字符串是位模式和焦炭是通过所述图案所表示的值。 问题是我如何存储我的压缩文件的头部,所以我可以重新建立相同的地图时,我想对它进行解码?

试图将其存储为二进制:

size_t mapLen = ciMap.size();
outFile.write(reinterpret_cast<char*>(&mapLen), sizeof(size_t));
outFile.write(reinterpret_cast<char*>(&ciMap), sizeof(ciMap));

和后面构建:

inFile.read(reinterpret_cast<char*>(&mapLen), sizeof(size_t));
inFile.read(reinterpret_cast<char*>(&ciMap), sizeof(mapLen));

不工作,我得到串动初始化错误...是与NULL。有什么建议么?如果您有存储位和值的更好的方法,我想听到的。

有帮助吗?

解决方案

您可以自己做,或者你可以用升压做到这一点:的 http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html 。你现在尝试只是查看地图作为一个普通的老数据类型,基本上意味着它是一个C的数据类型。但它不是,所以无法保存/载入。升压系列化做它正确。看看它。如果你不想使用它,你可以做这样的事情:

typedef std::map<std::string, char> my_map;
my_map ciMap;

// saving
std::ofstream stream("file.txt");
for(my_map::const_iterator it = ciMap.begin(); it != ciMap.end(); ++it) {
    stream << it->first << " " << it->second << std::endl;
}

// loading
char c;
std::string bits;
std::ifstream stream("file.txt");
while(stream >> bits >> c)
    ciMap.insert(std::make_pair(bits, c));

请注意的是,上述需要一些变化,如果存储可能是空白字符太的字符。正因为如此,它可能是最好先转换为int写出来,然后再加载时读为int之前。其实,我建议升压序列化,并提升输入输出流( HTTP ://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html ),其包括透明可过于压缩数据的压缩流

其他提示

您不能只是序列以这种方式磁盘的二进制值。中内存中的表示是不单纯的存储器的连续块,并且即使是它可能会包含指针,其是相对于块的地址。

您需要遍历在地图上和单独序列化了每个项目。然后通过一个阅读过盘一个项目,并将它们重新插入到地图把他们带回你重建地图。

大问题。这里的问题是,默认容器不支持序列 - 你必须把它写自己,这是一个痛苦,但它是可能的。

下面是你如何可以序列化std::map为文本格式。你能适应它写信给任何你需要的二进制格式。只是替换<<readswrites运算符。

template<typename K, typename V>
std::ostream &operator << (std::ostream &out, const std::map<K,V> &map) {
    out << "map " << map.size() << "\n";
    for (typename std::map<K,V>::const_iterator i = map.begin(); i != map.end(); ++i) {
        out << (*i).first << "\n" << (*i).second << "\n";
    }
    return out;
}

template<typename K, typename V>
std::istream &operator >> (std::istream &in, std::map<K,V> &map) {
    std::string mapkeyword;
    size_t num;
    in >> mapkeyword >> num;
    for (size_t i = 0; i < num; ++i) {
        K key; V value;
        in >> key >> value;
        map[key] = value;
    }
    return in;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top