지도에 내용 (키는 int, 값은 자체 정의 된 구조체)을 파일에 쓰고 나중에 파일에서로드해야합니다. 내가 CArchive와 MFC에서 그것을 할 수 있습니까?CArchive를 사용하여 MFC에서 STL의 맵을 serialize 할 수 있습니까?
감사합니다.
지도에 내용 (키는 int, 값은 자체 정의 된 구조체)을 파일에 쓰고 나중에 파일에서로드해야합니다. 내가 CArchive와 MFC에서 그것을 할 수 있습니까?CArchive를 사용하여 MFC에서 STL의 맵을 serialize 할 수 있습니까?
감사합니다.
나는 MFC에 대해 잘 모르겠지만, 문제는 오히려 하찮게 Boost.Serialization
struct MapData {
int m_int;
std::string m_str;
private:
friend class boost::serialization::access;
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & m_int;
ar & m_str;
}
};
std::map< int, MapData > theData;
template<class Archive>
void serialize(Archive & ar, std::map< int, MapData > & data, const unsigned int version)
{
ar & data;
}
그리고 나중에 진짜 보관하고 싶어했다 사용하여 해결된다 :
std::ofstream ofs("filename");
boost::archive::binary_oarchive oa(ofs);
oa << theData;
예요 .
(면책 조항 : 단순히 전혀 테스트되지 않은이 상자에 입력 한 코드, 오타의 의도 된) MFC에서
, 내가 먼저지도의 크기를 직렬화하는 가장 쉬운 방법 생각하고 간단하게 모든 반복 요소들.
당신이 std::map
를 사용하거나 MFC의 CMap
하지만 std::map
에 따라 버전은 다음과 같이 할 수 있다면 당신은 지정하지 않은 :
void MyClass::Serialize(CArchive& archive)
{
CObject::Serialize(archive);
if (archive.IsStoring()) {
archive << m_map.size(); // save element count
std::map<int, MapData>::const_iterator iter = m_map.begin(),
iterEnd = m_map.end();
for (; iter != iterEnd; iter++) {
archive << iter->first << iter->second;
}
}
else {
m_map.clear();
size_t mapSize = 0;
archive >> mapSize; // read element count
for (size_t i = 0; i < mapSize; ++i) {
int key;
MapData value;
archive >> key;
archive >> value;
m_map[key] = value;
}
}
}
을 보관, 스트리밍 작업 중 하나를 읽을 때 에러가 발생하면해야 예외를 던지면 더 높은 수준의 프레임 워크에 걸리게됩니다.
감사합니다. 부스트를 사용하는 것이 좋습니다. 그러나, 나는 CArchive를 사용하는 접근법을 연구했다. 내 접근 방식의 주요 아이디어는지도의 모든 요소를 직렬화하는 것입니다. – user26404