문제

기본적으로 Huffman 테이블이 있습니다

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로 읽는 것이 가장 좋습니다. 실제로, 나는 직렬화 부스트를 권장하고 ioStreams를 향상시키는 것이 좋습니다 (http://www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html), 여기에는 투명하게 데이터를 압축 할 수있는 압축 스트림이 포함되어 있습니다.

다른 팁

이런 방식으로 바이너리 값을 디스크로 직렬화 할 수는 없습니다. IN 메모리 표현은 단순히 연속적인 메모리 블록이 아니며, 그 경우에도 블록의 주소와 관련된 포인터가 포함될 수 있습니다.

지도를 반복하고 각 항목을 개별적으로 직렬화해야합니다. 그런 다음 디스크의 항목을 하나씩 읽고지도에 다시 삽입하여 맵을 재구성합니다.

좋은 질문. 문제는 기본 컨테이너가 직렬화를 지원하지 않는다는 것입니다. 직접 작성해야합니다. 고통이지만 가능합니다.

직렬화 방법은 다음과 같습니다 std::map 텍스트 형식으로. 필요한 바이너리 형식으로 작성하도록 조정할 수 있습니다. 그냥 교체하십시오 << 운영자 reads 그리고 writes.

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