C++ hashmap 写入文件

我对C++不太熟悉,用的少,
请问下,现在有一个hashmap,我要把他存到一个文件中【二进制的dat文件可以吧?】
然后,需要随时向文件中添加键值对,就是直接写文件将键值对添加到hashmap中【不知道可行不?怎么实现?】
再然后,要读出这个hashmap以查找数据
不知如何实现?请各位帮忙

实在悲剧的厉害。刚刚我按常规写对象入文件的方法,想实现这个,
弄了好久也没搞定,后来才知道像map,vector,hasp_map这样动态的存储结构是无法将其对象写入文件的。只能存数据。
像楼上说的用CArchive类,我觉得应该行不能,毕竟CArchive只能写CObject对象!
在网上找了个写map入文件的实现,它也不是直接写对象,而是写数据。读的时候再根据数据构造对象内容。对于hash_map也应该一样,再封装一下应该不难吧?

#include<iostream>
#include<fstream>
#include<string>
#include<map>
#include<utility>
using namespace std;
int main(){
map<int ,string> my_map;
string word;
int count=0;
cout<<"请输入字符串数据"<<endl;
while(count!=4) {
cin>>word ;
my_map.insert(make_pair(++count,word));
}
//读入文本
ifstream ins("text.txt");
ofstream ous("text.txt");
map<int ,string>::iterator iter=my_map.begin();
for(;iter!=my_map.end();iter++){
ous<<iter->first<<" "<<iter->second<<endl;
}
//从文本中读出
map<int ,string> your_map;
while(!ins.eof()){
int key;
string value;
ins>>key>>value;
your_map.insert(make_pair(key,value));
}
for(map<int,string>::iterator itr=your_map.begin();itr!=your_map.end();itr++){
cout<<"The "<<itr->first<<"th word is"<<itr->second<<endl;

}
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-02-25
你读文件时就可以判断是否读取这样行,
class CWorker
{
//其它信息
int m_nDeleteFlag; // 删除标记 0表示删除 1表示未删除
}
CWorker* pWorker = new CWorker;

ifstream theInFile("",ios::in|ios::binary|ios::nocreate);
theInFile.seekg(0,ios::beg);
theInFile.read((char*)&pWorker ,sizeof(CWorker));
if(pWorker->m_nDeleteFlag)
{
//显示信息
}

没有具体实现代码,有很多错,这只是一个思路
如果你是想真实删除一行的话,如果数据量很大的话就是一难题了,想一下,一部8G的电影为什么一下就删除了,拷贝8G要很长时间,因为删除是做标记位,追问

你再说什么,我不要删除啊,还有,你这跟我的问题有关系吗?

第2个回答  2011-02-25
可以,可利用VC++的CArchive类与CFile类轻松实现。追问

求详解,求示例代码

C++ hashmap 写入文件
ous<<iter->first<<" "<<iter->second<<endl;} \/\/从文本中读出 map<int ,string> your_map;while(!ins.eof()){ int key;string value;ins>>key>>value;your_map.insert(make_pair(key,value));} for(map<int,string>::iterator itr=your_map.begin();itr!=your_map.end();itr++...

c++ 为什么hashmap占用内存多
1、导入stl中的hash_map类库 include <hash_map> using namespace std;using namespace stdext;2、hash_map是一个聚合类 它继承自_Hash类,包括一个vector,一个list和一个pair,其中vector用于保存桶,list用于进行冲突处理,pair用于保存key->value结构,简要地伪码如下:class hash_map<class _Tk...

C++编程,从一个文件中统计所有出现过的单词,并按次数从大到小输出_百度...
ifstream::in);unordered_map < string, int > um;string s;while (ifs >> s){if (um.find(s) == um.end()) um[s] = 1;else ++um[s];}ifs.close();\/

C++ Map中的数据存储方式是什么?Map和HashMap有什么区别?
则1的储存位置为1,3的储存位置为9,4的储存位置为16 如果查找4的话,只需将将要查找的数字也用自定义函数变换一下,直接到换算后的位置上寻找就好了 这样只要比较一次就好了。如过想查找4,换算后为16,直接用这个数字和HASHMAP中的第16个元素比较,就课得出结果了 ...

c++算法,关于出现频率最大的数的问题
如果使用hashmap,则复杂度应该是o(n+n*logm+m),m为字符串的种数,m<=n。理解为对遍历数组O(n)+对hashmap的检索和对象添加O(n*logm)+对hashmap进行遍历查找最大值。以下方法可以做一点点优化。复杂度应该是o(n+n*logn),即一次遍历和一次快速排序 1、将原字符串数组排序(让同一字符串排...

帮忙写个函数,c语言的不要c++。
第二种就是你用链表来二分查找.二分查找key(就是b0a1),将key对应的value(即HZ12_b0a1 地址)对应出来.查找速度N*log(N).第三种我也不会,建议你不要用了,就是做一个hash映射将key(b0a1)对应的byte映射到一组新的地址中去,而这个地址中存着value值.这个方法就是java中的hashmap类方法,但是C...

求高手用c++解决二十四点的问题,具体如下
这个数据结构用在这里正合适,也就是说不用两个HashSet加两个ArrayList解决了,直接存在一个HashMap里面就可以。 具体的做法是:把计算结果存在map的key中,而表达式存在map的value中,问题彻底解决。map中key的查找效率是很高的,同时插入也很快;当找到一个计算结果为24的时候直接根据这个key去寻找相应的value即可得到完美...

c++ 输出map每个元素的值
usingnamespacestd;intmain(){ multimap<string,int>m_map;strings("中国"),s1("美国");m_map.insert(make_pair(s,50));m_map.insert(make_pair(s,55));m_map.insert(make_pair(s,60));m_map.insert(make_pair(s1,30));m_map.insert(make_pair(s1,20));m_map.insert(make_pair...

folly::ConcurrentHashMap的内存回收方式
Facebook开源的C++库folly中的ConcurrentHashMap内存回收机制依赖于hazard pointers技术。在并发环境下,folly确保即使节点从链表中移除,只要可能有其他线程仍能访问,内存不会立即释放,以防止数据竞争。关键策略是,节点的内存回收会在其前驱节点被回收之后进行,确保线程安全的遍历。folly通过Atom count_标识...

pprof:alloc全流程解析
在文件的第一行,依次写入总的分配的bytes,使用的object等信息,以及memprofileRate。(值得一提的是,这里的memprofilerate为了兼容旧的c++profiler所以乘以了一个2.并不准确)fmt.Fprintf(w,"heapprofile:%d:%d[%d:%d]@heap\/%d\\n",total.InUseObjects(),total.InUseBytes(),total.AllocObjects,total...

相似回答