سؤال

وأساسا، لقد حصلت على مائدتي هوفمان ك

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));

ولا يعمل، وأحصل على خطأ initilization سلسلة ... أن تفعل شيئا مع NULL. أي اقتراحات؟ إذا كان لديك طريقة أفضل للتخزين بت والقيم أود أن يسمع.

هل كانت مفيدة؟

المحلول

ويمكنك أن تفعل ذلك بنفسك، أو يمكنك أن تفعل ذلك مع زيادة: <لأ href = "http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html" يختلط = "noreferrer نوفولو"> 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 قبل كتابة بها، ومن ثم قراءة باعتباره الباحث عند تحميل. في الواقع، أوصي دفعة التسلسل، وiostreams دفعة ( HTTP : //www.boost.org/doc/libs/1_37_0/libs/iostreams/doc/index.html)، والذي يتضمن تيار الضغط الذي بشفافية يمكن ضغط البيانات الخاصة بك أيضا

نصائح أخرى

وأنت لا يمكن أن تسلسل القيم الثنائية إلى القرص في هذا السبيل. وفي تمثيل الذاكرة لا هو مجرد كتلة قريبة من الذاكرة، وحتى لو كان ذلك من المرجح أن تتضمن مؤشرات التي هي نسبة إلى عنوان للكتلة.

وتحتاج إلى تكرار عبر خريطة وتسلسل من كل بند على حدة. ثم لاعادتهم فيكم إعادة بناء خريطة طريق قراءة البنود قبالة قرص واحد تلو الآخر، وإعادة إدراج لهم في الخريطة.

والسؤال الكبير. المشكلة هنا هي أن الحاويات الافتراضي لا تدعم التسلسل - لديك لكتابة ذلك بنفسك، انها الألم، ولكن من الممكن

وهنا هو كيف يمكن أن تسلسل 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